以下的文章主要介紹的是MySQL鎖的實際優化過程,以下就是MySQL鎖的優化的具體方案的描述,希望在你今後的學習中會有所幫助。我們大家都知道當前MySQL已經支持 ISAM, MyISAM, MEMORY (HEAP) 類型表的表級鎖了。
BDB 表支持頁級鎖,InnoDB 表支持行級鎖
很多時候,可以通過經驗來猜測什麼樣的鎖對應用程序更合適,不過通常很難說一個MySQL鎖比別的更好,這全都要依據應用程序來決定,不同的地方可能需要不同的鎖。
鎖機制
當前MySQL已經支持 ISAM, MyISAM, MEMORY (HEAP) 類型表的表級鎖了,BDB 表支持頁級鎖,InnoDB 表支持行級鎖。很多時候,可以通過經驗來猜測什麼樣的鎖對應用程序更合適,不過通常很難說一個鎖比別的更好,這全都要依據應用程序來決定,不同的地方可能需要不同的鎖。
想要決定是否需要采用一個支持行級鎖的存儲引擎,就要看看應用程序都要做什麼,其中的查詢、更新語句是怎麼用的。例如,很多的web應用程序大量的做查詢,很少刪除,主要是基於索引的更新,只往特定的表中插入記錄。采用基本的MySQL MyISAM 表就很合適了。
MySQL中對表級鎖的存儲引擎來說是釋放死鎖的。避免死鎖可以這樣做到:在任何查詢之前先請求鎖,並且按照請求的順序鎖表。
MySQL中用於 WRITE(寫) 的表鎖的實現機制如下:
如果表沒有加鎖,那麼就加一個寫鎖。
否則的話,將請求放到寫鎖隊列中。
MySQL中用於 READ(讀) 的表鎖的實現機制如下:
如果表沒有加寫鎖,那麼就加一個讀MySQL鎖。
否則的話,將請求放到讀鎖隊列中。
當鎖釋放後,寫鎖隊列中的線程可以用這個鎖資源,然後才輪到讀鎖隊列中的線程。
這就是說,如果表裡有很多更新操作的話,那麼 SELECT 必須等到所有的更新都完成了之後才能開始。
從 MySQL 3.23.33 開始,可以通過狀態變量 Table_locks_waited 和 Table_locks_immediate 來分析系統中的鎖表爭奪情況:
- mysql> SHOW STATUS LIKE 'Table%';
- +-----------------------+---------+
- | Variable_name | Value |
- +-----------------------+---------+
- | Table_locks_immediate | 1151552 |
- | Table_locks_waited | 15324 |
- +-----------------------+---------+
在 MySQL 3.23.7(在Windows上是3.23.25)以後,在 MyISAM 表中只要沒有沖突的 INSERT 操作,就可以無需使用MySQL鎖表自由地並行執行 INSERT 和 SELECT 語句。
也就是說,可以在其它客戶端正在讀取 MyISAM 表記錄的同時時插入新記錄。如果數據文件的中間沒有空余的磁盤塊的話,就不會發生沖突了,因為這種情況下所有的新記錄都會寫在數據文件的末尾(當在表的中間做刪除或者更新操作時,就可能導致空洞)。當空洞被新數據填充後,並行插入特性就會自動重新被啟用了。
如果想要在一個表上做大量的 INSERT 和 SELECT 操作,但是並行的插入卻不可能時,可以將記錄插入到臨時表中,然後定期將臨時表中的數據更新到實際的表裡。可以用以下命令實現: