MySQL 允許通過 **調度優先級** 和 **鎖機制** 兩大維度,優化多客戶端並發場景下的查詢性能與公平性。
LOCK TABLES / UNLOCK TABLES| 操作類型 | 需求鎖 | 兼容性 | 說明 |
|---|---|---|---|
| 寫入 (INSERT/UPDATE/DELETE) | 排他寫鎖 (WRITE LOCK) | 與任何鎖衝突 | 表處於不一致狀態,索引需維護,不可並發 |
| 讀取 (SELECT) | 共享讀鎖 (READ LOCK) | 與讀鎖兼容,與寫鎖衝突 | 不修改數據,允許並發讀 |
**後果**:大量更新操作會導致 SELECT 長期等待 (寫入飢餓讀取)。
| 修飾符 | 適用語句 | 適用引擎 | 效果 |
|---|---|---|---|
| LOW_PRIORITY | DELETE, INSERT, LOAD DATA, REPLACE, UPDATE | MyISAM, MEMORY | 降低寫優先級,讓等待的讀優先執行 |
| HIGH_PRIORITY | SELECT, INSERT | MyISAM, MEMORY | 提升讀優先級 (SELECT);INSERT 跳過寫鎖隊列直接執行 |
| DELAYED | INSERT, REPLACE | MyISAM, MEMORY | 客戶端立即返回,服務器空閒時批量寫入 |
-- 1. 非關鍵統計更新,不阻塞核心查詢
UPDATE LOW_PRIORITY stats SET pv=pv+1 WHERE page='home';
-- 2. 關鍵用戶查詢,搶佔優先級
SELECT HIGH_PRIORITY * FROM users WHERE id=100;
-- 3. 大批量日志寫入,不阻塞業務
INSERT DELAYED INTO access_log (url, ua, ip) VALUES (...);
-- 4. 會話級設置所有更新低優先級
SET LOW_PRIORITY_UPDATES=1;
-- 全局設置
SET GLOBAL low_priority_updates=1;
-- 配置文件永久
[mysqld]
low-priority-updates=1
LIKE '%xxx%'、IS NULL 導致全掃binlog_format=ROWOPTIMIZE TABLE 清理空洞恢復特性INSERT DELAYED (MyISAM/MEMORY)DELETE ... LIMIT 1000 分批刪除,減少持鎖時間SELECT SQL_BUFFER_RESULT 結果先存臨時表,釋放表鎖| 指標 | 來源 | 告警閾值 | 含義 |
|---|---|---|---|
| Table_locks_waited / (immediate+waited) | SHOW STATUS | > 1% | 表鎖等待率 |
| Innodb_row_lock_waits | SHOW STATUS | 持續增長 | 行鎖等待次數 |
| Innodb_row_lock_time_avg | SHOW STATUS | > 10ms | 平均行鎖等待時間 |
| Innodb_deadlocks | SHOW STATUS | > 0 | 死鎖次數 |
| Slow_queries | SHOW STATUS | 業務基線 | 慢查詢累計 |
「MyISAM 表鎖:LOW_PRIORITY 寫、HIGH_PRIORITY 讀、DELAYED 非即時、並發插入靠無空洞」
「InnoDB 行鎖:索引命中、範圍最小、事務最短、RC 隔離級別」
「調度修飾符:語句級精準控制、會話級批量設置、全局級策略固化」
「監控驅動:Table_locks_waited 率、Innodb_row_lock_waits、死鎖歷史」
「架構選型:95% 場景 InnoDB 行鎖+MVCC 徹底解決讀寫衝突」
調度與鎖的協同調優,本質是 **在一致性、並發性、延遲性三角中找平衡**。MyISAM 靠優先級妥協;InnoDB 靠 MVCC 突破。認清引擎特性,匹配業務場景,監控指標說話,才是優化正道。