mysql優化之MyISAM表鎖


概述

      MyISAM存儲引擎只支持表鎖,mysql的表鎖有兩種模式:讀鎖和寫鎖。

       他們的兼容關系是(對myisam的讀操作,不會阻塞其他用戶對同一表的讀請求,但會阻塞對同一表的寫操作*)和(對myisam的寫操作,則會阻塞其他用戶對同一表的讀和寫操作),讀寫操作是串行的。

 

如何加表鎖

      MyISAM在執行查詢語句(select)前,會自動給涉及的所有表加上讀鎖

      在執行更新操作(update,delete,insert等)前,會自動給涉及的表加上寫鎖,這個過程不需要用戶干預。


       說明:

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

 

 

 

原文:http://www.2cto.com/database/201506/404702.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM