淺議mysql鎖表機製
理論研究
作者:吳金洪
【摘要】 MySQ有三種鎖的級別:頁級、表級、行級。本文簡要分析三種鎖的特點,簡要的分析了表級鎖的典型應用MyISAM。
【關鍵詞】頁級 表級 行級
MyISAM存儲引擎隻支持表鎖,是現在用得最多的存儲引擎。
一、查詢表級鎖爭用情況
可以通過檢查table_locks_waited和table_locks_immediate狀態變量來分析係統上的表鎖定爭奪:
mysql> show status like ‘table%’;
+———————–+———-+
| Variable_name | Value |
+———————–+———-+
| Table_locks_immediate | 76939364 |
| Table_locks_waited | 305089
|+———————–+———-+
Table_locks_waited的值比較高,說明存在著較嚴重的表級鎖爭用情況。
二、MySQL表級鎖的鎖模式
MySQL的表級鎖有兩種模式:表共享讀鎖(Table Read Lock)和表獨占寫鎖(Table WriteLock)。MyISAM在執行查詢語句(SELECT)前,會自動給涉及的所有表加讀鎖,在執行更新操作(UPDATE、DELETE、INSERT等)前,會自動給涉及的表加寫鎖。所以對MyISAM表進行操作,會有以下情況:對MyISAM表的讀操作(加讀鎖),不會阻塞其他進程對同一表的讀請求,但會阻塞對同一表的寫請求。隻有當讀鎖釋放後,才會執行其它進程的寫操作。對MyISAM表的寫操作(加寫鎖),會阻塞其他進程對同一表的讀和寫操作,隻有當寫鎖釋放後,才會執行其它進程的讀寫操作。
下麵通過例子來進行驗證以上觀點。數據表gz_phone裏有二百多萬數據,字段id,phone,ua,day。當我用客戶端1進行一個比較長時間的讀操作時,分別用客戶端2進行讀和寫操作:
client1:
mysql>select count(*) from gz_phone group by ua;
75508 rows in set (3 min 15.87 sec) client2:
select id,phone from gz_phone limit 1000,10;
+——+——-+
| id | phone |