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

MySQL EXPLAIN 執行計畫深度解讀:從輸出欄位到優化決策

     編輯:MySQL 資料庫相關知識

為什麼需要 EXPLAIN

SQL 執行慢?先 EXPLAIN。它揭示優化器如何訪問表、使用哪個索引、連接順序、臨時表/檔案排序等關鍵資訊,是優化的「X 光片」。

支援語句類型

SELECT、DELETE、INSERT、REPLACE、UPDATE(5.6+)

核心輸出欄位解讀

欄位關鍵含義優化目標
id查詢序號,越大越先執行—
select_typeSIMPLE/PRIMARY/SUBQUERY/DERIVED/UNION 等衍生表物化優化
table訪問的表/衍生表別名—
partitions匹配的分區分區裁剪驗證
type訪問類型:system > const > eq_ref > ref > range > index > ALL至少達 ref,避免 ALL
possible_keys理論可用索引—
key實際使用索引若為 NULL 需補索引
key_len索引長度(字節),判斷聯合索引用了幾列—
ref與索引比較的列/常數—
rows預估掃描行數(統計資訊為準)越小越好
filtered按表條件過濾後剩餘比例 %越大越好
ExtraUsing index/Using where/Using temporary/Using filesort 等避免 temporary/filesort

實戰優化清單

  1. type=ALL → 全表掃描 → 加索引或改寫 WHERE
  2. key=NULL → 未用索引 → 檢查索引定義、型別一致、函數包裹、隱含轉換
  3. Using temporary → 臨時表 → 優化 GROUP BY/ORDER BY、增加覆蓋索引
  4. Using filesort → 檔案排序 → 索引順序滿足 ORDER BY、增大 sort_buffer_size
  5. rows 偏大 → 統計資訊過期 → ANALYZE TABLE 更新

索引失效常見模式

-- 1. OR 條件未全覆蓋索引
WHERE a=1 OR b=2

-- 2. 聯合索引非最左前綴
INDEX (a,b,c)  WHERE b=1

-- 3. LIKE 以 % 開頭
WHERE name LIKE '%abc'

-- 4. 字串欄位比較數字(隱含轉換)
WHERE varchar_col = 123

-- 5. 優化器判斷全表掃描更快(rows > 30% 表大小)
-- 可用 FORCE INDEX 強制,但需測試

進階:EXPLAIN ANALYZE (8.0.18+)

EXPLAIN ANALYZE SELECT * FROM t WHERE c1 > 100;
-- 輸出實際執行時間、迴圈次數、實際掃描行數,精準定位熱點

工具鏈

  • phpMyAdmin / MySQL Workbench / DBeaver 圖形化 EXPLAIN
  • pt-visual-explain 文字轉樹狀圖
  • 慢查詢日誌 + pt-query-digest 自動分析 Top N

熟練讀懂 EXPLAIN,優化從「猜測」變為「確鑿」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved