(5)mysql優化之MyISAM表鎖

概述

  MyISAM存儲引擎只支持表鎖,mysql的表鎖有兩種模式:讀鎖和寫鎖。他們的兼容關係是(對myisam的讀操作,不會阻塞其他用戶對同一表的讀請求,但會阻塞對同一表的寫操作*)和(對myisam的寫操作,則會阻塞其他用戶對同一表的讀和寫操作),讀寫操作是串行的。

如何加表鎖

  MyISAM在執行查詢語句(select)前,會自動給涉及的所有表加上讀鎖。在執行更新操作(update,delete,insert等)前,會自動給涉及的表加上寫鎖,這個過程不需要用戶干預。如果要顯示加鎖,參見鏈接:
http://blog.csdn.net/pursuing0my0dream/article/details/45166975
說明:

  • lock tables 加上‘local’選項,其作用就是在滿足MyISAM表併發插入條件下,允許其他用戶在表尾併發的插入記錄。
  • 在lock tables 給表顯式加表鎖時候,必須同時取得所有涉及表的鎖,並且MySQL不支持鎖升級。即在執行lock tables後,只能訪問顯式加鎖的這些表,不能訪問未加鎖的表。MyISAM總是一次獲取sql語句所需要的全部鎖。這就是MyISAM表不會出現死鎖的原因。
  • 當使用lock tables時,不僅需要一次鎖定用到的表,而且,同一個表在sql語句中出現多少次,就要在相同的別名中鎖定多少次。

併發插入

在一定的條件下,MyISAM表支持查詢和插入併發執行。MyISAm有一個系統變量concurrent_insert,用來專門控制其併發行爲的。0-不允許插入;1-如果表沒有空洞,允許在表尾插入記錄,這是mysql默認設置;2-無論是否有空洞,都允許在表尾插入記錄。

鎖調度

myISAM的讀鎖和寫鎖是互斥的,讀寫串行的。那麼,在一個進程請求某個MyISAM表的鎖的時候,同時另一個進程也請求同一表的寫鎖。MySQL如何處理?結果是先寫進程後讀進程。這是應爲mysql認爲寫請求一般比讀請求重要。我們可以通過一些設置來改變鎖處理先後順序:

  • 通過啓動參數low-priority-updates,使MyISAM引擎默認給予讀侵權以優先權利。
  • 通過set low_priority_updates=1,使該連接發出的更新請求優先級降低。
  • 通過指定insert,update,delete語句的low_priority屬性,降低該語句的優先級。
  • 還可以設置max_write_lock_count。當表的讀鎖到這個值的時候,mysql就暫時將寫請求的優先級降低,給讀進程一個獲得鎖的機會。
發佈了63 篇原創文章 · 獲贊 37 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章