預設排程策略
- 寫入請求依到達順序處理(FIFO)。
- 寫入優先級高於讀取:讀取中來寫入 → 寫入等待;寫入等待中來讀取 → 讀取也等待,寫入優先執行。
以表鎖實現:寫入需獨占鎖,讀取需共享鎖(阻擋寫入、允許並發讀取)。
三大排程修飾符
1. LOW_PRIORITY(寫入降級)
- 適用:
DELETE、INSERT、LOAD DATA、REPLACE、UPDATE。
- 行為:寫入不再優先於讀取。若寫入等待中有新讀取請求,讀取插隊在寫入前執行。
- 風險:持續高讀取負載下,寫入可能永遠餓死(Starvation)。
- 適用場景:非即時性的批次更新、資料匯入、報表彙總寫入。
2. HIGH_PRIORITY(讀取升級)
- 適用:
SELECT。
- 行為:讀取插隊在正常優先級寫入前執行。
- 適用場景:關鍵即時查詢(儀表板、異常告警檢查),需繞過等待中的寫入。
3. INSERT DELAYED(延遲插入)
- 適用:
INSERT、REPLACE(MyISAM/MEMORY/ARCHIVE;InnoDB 5.6+ 支援但忽略 DELAYED 行為)。
- 行為:
- Server 將資料列放入隊列,立即回傳 OK 給 Client(Client 不阻塞)。
- 無讀取時,背景執行緒批次寫入隊列資料。
- 有讀取到來 → 隊列暫停,讓讀取優先。
- 循環直到隊列清空。
- 限制:
LAST_INSERT_ID() 無法取得自增 ID。
- 唯一鍵衝突不會報錯(Client 已收到 OK)。
- 崩潰未寫入的隊列資料會遺失。
- 適用場景:日誌寫入、點擊統計、非關鍵資料大量匯入,Client 需快速返回。
版本支援對照表
| 修飾符 | 最低版本 | 備註 |
| LOW_PRIORITY | 3.22 | 全支援 |
| HIGH_PRIORITY | 3.23 | 全支援 |
| INSERT DELAYED | 3.22 | InnoDB 忽略 DELAYED 行為 |
實戰決策指南
- 核心交易寫入:無修飾符,保證優先執行、強一致性。
- 批次報表更新:
LOW_PRIORITY UPDATE ... 避免衝擊線上查詢。
- 即時儀表板查詢:
HIGH_PRIORITY SELECT ... 秒級回應。
- 高頻日誌/統計寫入:
INSERT DELAYED INTO log_table ... Client 無阻塞,背景批次寫入。
- InnoDB 高併發寫入:考慮
innodb_thread_concurrency、innodb_adaptive_hash_index、INSERT ... ON DUPLICATE KEY UPDATE 替代 DELAYED。
注意事項
- 修飾符僅影響表鎖層級排程,InnoDB 行鎖由內部鎖管理器處理,效果有限。
- 長時間運行的
SELECT 仍會阻塞 LOW_PRIORITY 寫入(鎖未釋放)。
- 濫用
HIGH_PRIORITY 會導致寫入飢餓,謹慎使用。