首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

精通 MySQL EXPLAIN:執行計劃欄位完整解讀與優化實戰

     編輯:MySQL 綜合教學

EXPLAIN 輸出欄位詳細說明

欄位含義關鍵判讀
id查詢序號同 id 從上往下執行;id 越大越優先
select_type查詢類型SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION 等
table存取的表別名、衍生表 、子查詢
partitions匹配的分區分區表才顯示
type存取類型 (核心)system > const > eq_ref > ref > range > index > ALL (由好到壞)
possible_keys可能用到的索引為 NULL 表示無索引可用,需檢查 WHERE/JOIN 條件
key實際使用的索引為 NULL 表示全表掃描;可用 FORCE INDEX 強制
key_len索引使用長度 (bytes)越短越好;可推斷複合索引用了幾個欄位
ref與索引比較的值const、func、NULL、欄位名
rows預估掃描行數越少越好;配合 filtered 估算實際回傳
filtered按條件過濾後剩餘百分比100 表示無額外過濾
Extra額外資訊 (關鍵)見下表

Extra 欄位常見值與優化對策

Extra 值含義優化方向
Using index覆蓋索引,僅讀索引不回表✅ 極佳,維持
Using whereServer 層過濾若 rows 大,嘗試建立複合索引下推 (ICP)
Using index conditionICP (Index Condition Pushdown)✅ 5.6+ 自動優化
Using temporary建立臨時表 (通常 GROUP BY/ORDER BY)⚠️ 嘗試索引排序、增加 tmp_table_size
Using filesort外部排序 (無索引順序)⚠️ 加索引匹配 ORDER BY、避免 SELECT *
Using join buffer (Block Nested Loop)Join 無索引,使用緩衝區⚠️ 給 JOIN 欄位加索引
Impossible WHEREWHERE 條件永假✅ 優化器直接返回空
Select tables optimized away聚合函數直接用索引✅ 極佳
No tables used無 FROM 子句—

type 存取類型深度解析 (由優到劣)

  1. system / const:表僅 0/1 行,或主鍵/唯一索引等值查詢。最快。
  2. eq_ref:JOIN 時驅動表每行在被驅動表精確匹配 1 行 (主鍵/唯一索引)。
  3. ref:非唯一索引等值查詢,或複合索引最左前綴匹配。
  4. range:索引範圍掃描 (>, <, BETWEEN, IN, LIKE 'prefix%')。
  5. index:全索引掃描 (比 ALL 好,因索引通常較小)。
  6. ALL:全表掃描,必須優化 (加索引、分區、縮小範圍)。

實戰優化清單

  1. type = ALL → 檢查 possible_keys,建立適當索引。
  2. key_len 過長 → 複合索引欄位過多或 VARCHAR 過長,考慮前綴索引。
  3. rows × filtered% 過大 → 條件下推不足,調整索引順序或改寫 SQL。
  4. Using temporary / filesort → 索引覆蓋 ORDER BY/GROUP BY 欄位。
  5. Using join buffer → 給 JOIN ON 欄位加索引,小表驅動大表。

進階:FORMAT=JSON / TREE

EXPLAIN FORMAT=JSON SELECT ...;  -- 含成本估算、索引選擇細節
EXPLAIN FORMAT=TREE SELECT ...;  -- 8.0.16+ 可視化樹狀結構
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved