(5)mysql最佳化之MyISAM表鎖,mysqlmyisam

來源:互聯網
上載者:User

(5)mysql最佳化之MyISAM表鎖,mysqlmyisam
概述

  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就暫時將寫請求的優先順序降低,給讀進程一個獲得鎖的機會。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.