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

MySQL 查詢優化深度解析:調度策略與鎖機制

     編輯:MySQL 資料庫相關知識

核心概念:讀者與寫者

  • 讀者:執行 SELECT 查詢的客戶端
  • 寫者:執行 INSERT、UPDATE、DELETE、REPLACE 的客戶端

預設調度策略

  1. 寫操作優先於讀操作
  2. 同一張表同一時間只能有一個寫操作,按到達順序排隊
  3. 多個讀操作可同時進行

鎖機制實作

表級鎖

MyISAM、MEMORY 引擎使用表級鎖:

  • 讀鎖 (共享鎖):允許其他讀者同時讀取,阻塞寫者
  • 寫鎖 (排他鎖):阻塞所有其他讀者與寫者

鎖由伺服器自動管理,亦可透過 LOCK TABLES/UNLOCK TABLES 手動控制。

為什麼寫鎖要排他?

寫操作過程中資料表處於不一致狀態(索引同步更新中),允許並發讀寫會導致髒讀或資料損毀。

調度修飾符

修飾符適用語句效果
LOW_PRIORITYDELETE, INSERT, LOAD DATA, REPLACE, UPDATE降低寫操作優先級,讓等待中的讀者優先執行
HIGH_PRIORITYSELECT, INSERT提升讀/寫優先級,插隊至等待中的寫者之前
DELAYEDINSERT, REPLACE資料放入隊列立即返回,背景執行緒稍後寫入

DELAYED vs LOW_PRIORITY 差異

  • LOW_PRIORITY:客戶端阻塞等待,直到寫入完成
  • DELAYED:客戶端立即返回,伺服器背景緩衝處理,不阻塞客戶端

風險:DELAYED 寫入前伺服器崩潰會導致資料遺失;無法取得 AUTO_INCREMENT 值;唯一鍵衝突無法即時檢測。

並發插入

MyISAM 特有機制:當資料檔中間無「空洞」(無刪除/更新產生的碎片) 時,允許 SELECT 讀取同時在檔案尾部 INSERT。

控制參數 concurrent_insert:

  • 0:停用
  • 1 (預設):無空洞時允許
  • 2:無論是否有空洞皆允許尾部並發插入

鎖層級與並發效能

引擎鎖層級並發特性適用場景
MyISAM表級讀多寫少、大量全表掃描報表、日誌、唯讀查詢
BDB頁面級中等並發,不同頁面可並發更新較少使用
InnoDB行級高並發,不同行可同時更新OLTP、高併發寫入、交易處理

死鎖風險

  • 表級鎖:伺服器預先鎖定所有需求表,**不會發生死鎖**
  • 行級/頁面級鎖:運行時動態獲取鎖,**可能發生死鎖**,InnoDB 會自動偵測並回滾其中一筆交易

實務建議

  • 高併發寫入場景優先選 InnoDB
  • 長時間查詢易導致 MyISAM 寫入飢餓,考慮 LOW_PRIORITY 或讀寫分離
  • 定期 OPTIMIZE TABLE 減少碎片,提升並發插入機會
  • 監控 Table_locks_waited / Table_locks_immediate 評估鎖爭用嚴重度
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved