除 InnoDB/BDB 外,所有引擎採用表級鎖。理解 LOCK TABLES、鎖優先級、並發插入機制、爭用優化,是 MyISAM 環境效能調優的必修課。本文系統整理語法、行為、優化策略與避坑指南。
-- 鎖定單表寫
LOCK TABLES t1 WRITE;
-- 鎖定多表:讀寫混合
LOCK TABLES t1 READ, t2 WRITE, t3 READ LOCAL;
-- 釋放所有鎖
UNLOCK TABLES;
READ:共享鎖,允許並發讀,阻塞寫WRITE:排他鎖,阻塞所有其他鎖READ LOCAL:允許非衝突並發插入 (MyISAM 專用)SELECT 導致後續 UPDATE 等待,再導致新 SELECT 等待 → **讀寫雙重飢餓**MyISAM 滿足條件時,INSERT 與 SELECT 可並發:
DELETE/UPDATE 變長行)READ LOCAL 或 concurrent_insert 系統變數控制--low-priority-updates:降低寫優先級,讓讀優先SET LOW_PRIORITY_UPDATES = 1:指定連線所有寫操作低優先級LOW_PRIORITY:INSERT LOW_PRIORITY ...、UPDATE LOW_PRIORITY ...HIGH_PRIORITY:SELECT HIGH_PRIORITY ... 強制搶佔max_write_lock_count:寫鎖達閾值後暫時提升讀優先級 (3.23.7+)INSERT DELAYED:寫入緩衝隊列,客戶端立即返回 (高寫入突發緩衝)DELETE ... LIMIT n:分批刪除,減少長鎖SELECT ... SQL_BUFFER_RESULT:結果先存臨時表,釋放表鎖thr_lock.c:單一鎖佇列,讀寫同權 (極端方案)mysqldump --lock-tables),需在事務外執行,並儘快 UNLOCK TABLESTable_locks_waited 飆升表鎖雖簡單,優先級倒置、並發插入條件、爭用優化卻暗藏大學問。MyISAM 環境下,「加速查詢、低優先級寫入、並發插入利用、拆表分區」四大戰術組合拳,能解決 90% 鎖爭用問題。長期來看,**遷移至 InnoDB 行鎖 + MVCC** 才是架構層面的終極答案。