MySQL 採用**表級鎖** (MyISAM) 或**行級鎖** (InnoDB) 實現並發控制,其預設調度策略遵循兩條鐵律:
設計初衷:保護數據一致性——寫操作修改數據結構,必須獨佔訪問;讀操作僅需共享鎖,允許並發讀。
| 已持有鎖 \ 請求鎖 | 共享鎖 (讀鎖) | 排他鎖 (寫鎖) |
|---|---|---|
| 共享鎖 (讀鎖) | ✅ 相容 | ❌ 阻塞 |
| 排他鎖 (寫鎖) | ❌ 阻塞 | ❌ 阻塞 |
InnoDB 行級鎖更細粒度,但意向鎖 (IS/IX) 邏輯一致。
INSERT LOW_PRIORITY INTO logs ...;
UPDATE LOW_PRIORITY accounts SET balance = balance - 100 WHERE id = 1;
DELETE LOW_PRIORITY FROM temp_data WHERE created < NOW() - INTERVAL 1 DAY;
INSERT, UPDATE, DELETE, REPLACE, LOAD DATA。SELECT HIGH_PRIORITY * FROM orders WHERE status = 'pending';
SELECT。INSERT DELAYED INTO access_log (url, ip) VALUES ('/home', '1.2.3.4');
REPLACE DELAYED INTO cache (key, value) VALUES ('k1', 'v1');
INSERT, REPLACE (MyISAM/MEMORY/ARCHIVE 引擎;InnoDB 忽略 DELAYED 警告但按普通 INSERT 處理)。AUTO_INCREMENT 值;LAST_INSERT_ID() 返回 0。| 修飾符 | MyISAM | InnoDB | 備註 |
|---|---|---|---|
| LOW_PRIORITY | ✅ 全支援 | ✅ 全支援 | 表鎖/行鎖層面生效 |
| HIGH_PRIORITY | ✅ 全支援 | ✅ 全支援 | SELECT 專用 |
| DELAYED | ✅ 原生支援 | ⚠️ 忽略並警告 | InnoDB 退化為普通 INSERT |
是否為關鍵業務寫入?
├─ 是 → 不使用任何修飾符,接受預設高優先級
└─ 否 → 讀負載高且寫入可延遲?
├─ 是 → INSERT/UPDATE/DELETE 加 LOW_PRIORITY
└─ 否 → 極高頻非關鍵日誌?
├─ 是 → MyISAM/MEMORY 表用 INSERT DELAYED
└─ 否 → 保持預設,優化索引/查詢結構
Table_locks_waited / Table_locks_immediate:鎖等待比率。Innodb_row_lock_waits / Innodb_row_lock_time_avg:行鎖等待次數與平均耗時。Slow_queries 配合 long_query_time 發現被阻塞的慢查詢。理解調度策略與鎖機制的交互關係,能幫助你在高併發場景下做出正確的權衡:是在數據一致性、寫入吞吐、讀取延遲三者間找到業務最優解,而非盲目追求單一指標極致。