首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 排程策略深度解析:讀寫優先級、LOW_PRIORITY、HIGH_PRIORITY 與 INSERT DELAYED 實戰應用

     編輯:MySQL 資料庫相關知識

預設排程策略

  1. 寫入請求依到達順序處理(FIFO)。
  2. 寫入優先級高於讀取:讀取中來寫入 → 寫入等待;寫入等待中來讀取 → 讀取也等待,寫入優先執行。

以表鎖實現:寫入需獨占鎖,讀取需共享鎖(阻擋寫入、允許並發讀取)。

三大排程修飾符

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 行為)。
  • 行為:
    1. Server 將資料列放入隊列,立即回傳 OK 給 Client(Client 不阻塞)。
    2. 無讀取時,背景執行緒批次寫入隊列資料。
    3. 有讀取到來 → 隊列暫停,讓讀取優先。
    4. 循環直到隊列清空。
  • 限制:
    • LAST_INSERT_ID() 無法取得自增 ID。
    • 唯一鍵衝突不會報錯(Client 已收到 OK)。
    • 崩潰未寫入的隊列資料會遺失。
  • 適用場景:日誌寫入、點擊統計、非關鍵資料大量匯入,Client 需快速返回。

版本支援對照表

修飾符最低版本備註
LOW_PRIORITY3.22全支援
HIGH_PRIORITY3.23全支援
INSERT DELAYED3.22InnoDB 忽略 DELAYED 行為

實戰決策指南

  1. 核心交易寫入:無修飾符,保證優先執行、強一致性。
  2. 批次報表更新:LOW_PRIORITY UPDATE ... 避免衝擊線上查詢。
  3. 即時儀表板查詢:HIGH_PRIORITY SELECT ... 秒級回應。
  4. 高頻日誌/統計寫入:INSERT DELAYED INTO log_table ... Client 無阻塞,背景批次寫入。
  5. InnoDB 高併發寫入:考慮 innodb_thread_concurrency、innodb_adaptive_hash_index、INSERT ... ON DUPLICATE KEY UPDATE 替代 DELAYED。

注意事項

  • 修飾符僅影響表鎖層級排程,InnoDB 行鎖由內部鎖管理器處理,效果有限。
  • 長時間運行的 SELECT 仍會阻塞 LOW_PRIORITY 寫入(鎖未釋放)。
  • 濫用 HIGH_PRIORITY 會導致寫入飢餓,謹慎使用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved