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

如何實現MySQL鎖的優化

編輯:MySQL綜合教程

以下的文章主要介紹的是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 來分析系統中的鎖表爭奪情況:

  1. mysql> SHOW STATUS LIKE 'Table%';   
  2. +-----------------------+---------+   
  3. | Variable_name | Value |   
  4. +-----------------------+---------+   
  5. | Table_locks_immediate | 1151552 |   
  6. | Table_locks_waited | 15324 |   
  7. +-----------------------+---------+  

在 MySQL 3.23.7(在Windows上是3.23.25)以後,在 MyISAM 表中只要沒有沖突的 INSERT 操作,就可以無需使用MySQL鎖表自由地並行執行 INSERT 和 SELECT 語句。

也就是說,可以在其它客戶端正在讀取 MyISAM 表記錄的同時時插入新記錄。如果數據文件的中間沒有空余的磁盤塊的話,就不會發生沖突了,因為這種情況下所有的新記錄都會寫在數據文件的末尾(當在表的中間做刪除或者更新操作時,就可能導致空洞)。當空洞被新數據填充後,並行插入特性就會自動重新被啟用了。

如果想要在一個表上做大量的 INSERT 和 SELECT 操作,但是並行的插入卻不可能時,可以將記錄插入到臨時表中,然後定期將臨時表中的數據更新到實際的表裡。可以用以下命令實現:

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