正文 淺議mysql鎖表機製(1 / 2)

淺議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 |