2010-06-09 31 views
2

因此,在閱讀Performance in PDO/PHP/MySQL: transaction versus direct execution關於性能問題時,我想到我對MySQL中的鎖定表進行了一些研究。MySQL鎖定表是否影響相關視圖?

http://dev.mysql.com/doc/refman/5.0/en/table-locking.html

表鎖定使許多會話 同時, 從表中讀取,但如果會話想要寫一個 表,它必須首先獲得獨佔 訪問。在更新期間,想要訪問此 特定表的所有其他 會話必須等到更新完成後才能更新 。

這部分讓我覺得特別是因爲我們大多數的查詢都是更新而不是插入。我想知道是否創建了一個名爲foo的表,在其上執行所有更新/插入,然後創建一個名爲foo_view(foo的副本,或者foo以及其他幾個表和foo的鏈接)這個鎖定問題是否仍然會發生?

也就是說,foo_view上的SELECT查詢是否仍然需要等待更新才能在foo上完成?

我的同事問另一個簡短的問題。這會影響緩存嗎?即如果SELECT被高速緩存,它會觸發緩存並返回結果,還是會等待鎖定先完成?

回答

3

您的視圖將體驗與基礎表相同的鎖定。

從MySQL參考頁面上locking

的MySQL授權表寫鎖爲 如下:

  1. 如果有在表上沒有鎖,放一個寫鎖就可以了。
  2. 否則,將鎖定請求放入寫入鎖定隊列中。

的MySQL授權表讀鎖定爲 如下:

  1. 如果有在表上沒有寫鎖定,把一個讀鎖。
  2. 否則,將鎖定請求放入讀鎖定隊列中。

值得一提的是,這取決於您正在使用的數據庫引擎。 MyISAM將按照上述步驟並鎖定整個表(即使它被拆分成多個分區),InnoDB之類的引擎將執行行級鎖定。

如果您沒有達到MyISAM所需的性能基準,並且您已經通過更新顯示您的瓶頸正在等待表鎖,那麼我會建議將表的存儲引擎更改爲InnoDB。

+0

感謝您的回答。我修改了我的問題以詢問緩存。如果一個查詢被緩存了,它是否會取代該鎖,或者只有在打開該鎖之後纔會返回緩存的查詢結果? – CogitoErgoSum 2010-06-09 18:59:51

+0

@CogitoErgoSum:不,查詢計劃緩存不會影響隔離級別。 – 2010-06-09 19:01:31

+0

感謝OMG小馬! – CogitoErgoSum 2010-06-09 19:02:32