程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> (5)mysql優化之MyISAM表鎖

(5)mysql優化之MyISAM表鎖

編輯:MySQL綜合教程

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved