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

MySQL EXPLAIN 執行計劃深度解析:從類型到 Extra 的效能診斷全指南

     編輯:MySQL 綜合教學

MySQL EXPLAIN 執行計劃深度解析:從類型到 Extra 的效能診斷全指南

EXPLAIN 是 SQL 調優的「聽診器」,通過在 SELECT 前加關鍵字,即可看到優化器如何訪問表、使用哪些索引、預估掃描行數等關鍵信息。

輸出列完整解讀

列名含義關鍵判讀
idSELECT 識別符,數字越大優先執行,相同則按順序關注執行順序,衍生表 (derived) 通常 id 較大
select_type查詢類型SIMPLE (無子查詢/UNION)、PRIMARY (最外層)、SUBQUERY、DERIVED (衍生表)、UNION/UNION RESULT
table訪問的表 (或衍生表別名)<derived2> 表示來自 id=2 的衍生表
partitions匹配的分區 (分區表才顯示)檢查分區裁剪是否生效
type ⭐訪問類型,效能由高到低system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
possible_keys理論可用索引為 NULL 表示無索引可用,需檢查 WHERE/JOIN 條件列
key ⭐實際選用索引為 NULL 則全掃;可用 FORCE INDEX / IGNORE INDEX 干預
key_len索引鍵長度 (字節)越短越好;推斷聯合索引用了幾列 (含 NULL 標誌 1 字節)
ref索引查找值來源const (常數)、col_name (關聯列)、func (函數結果)
rows ⭐預估掃描行數越小越好;配合 filtered (5.7+) 估算實際返回行
filtered按表條件過濾後剩餘比例 %100 表示無額外過濾;低值說明需回表過濾大量行
Extra ⭐額外信息,紅綠燈信號見下表

type 類型效能階梯詳解

  1. system/const:表僅 1 行或 PK/UK 精確查找,極快。
  2. eq_ref:多表 JOIN 時,驅動表每行在被驅動表精確匹配 1 行 (PK/UK),理想 JOIN。
  3. ref:非唯一索引或最左前綴匹配,可能返回多行,常見於二級索引查找。
  4. range:索引範圍掃描 (>, <, >=, <=, BETWEEN, IN, LIKE 'prefix%'),優於全表。
  5. index:全索引掃描 (覆蓋索引時不回表),優於 ALL 但仍需掃描全索引。
  6. ALL:全表掃描,大表災難,必須優化。

Extra 關鍵信號燈

信號含義動作
🟢 Using index覆蓋索引,僅讀索引不回表✅ 保持
🟢 Using whereServer 層過濾 (非存儲引擎)✅ 正常
🟡 Using index condition (ICP)存儲引擎層推送索引條件 (5.6+)✅ 優化生效
🔴 Using filesort需額外排序 (無序索引或 ORDER BY 非索引列)⚡ 加索引/調整 ORDER BY
🔴 Using temporary建立臨時表 (GROUP BY/DISTINCT/UNION 無索引)⚡ 加索引/改寫 SQL
🔴 Range checked for each record無好索引,逐行嘗試選索引⚡ 重設計索引
🟢 Distinct / Not exists優化器提前終止掃描✅ 良好

實戰優化清單

  1. 目標:type 至少達 ref,key 非 NULL,rows 最小化,Extra 無紅燈。
  2. 步驟:
    1. 執行 EXPLAIN SELECT ... 獲取計劃。
    2. 若 type=ALL → 檢查 WHERE/JOIN/ORDER BY 列是否有索引。
    3. 若 Using filesort → 為 ORDER BY 列加索引 (注意方向一致)。
    4. 若 Using temporary → 為 GROUP BY/DISTINCT 列加索引。
    5. 若 key_len 過長 → 檢查聯合索引列序、字符集、NULL 屬性。
    6. 驗證:EXPLAIN ANALYZE (8.0.18+) 看實際耗時與行數。
  3. 工具輔助:pt-visual-explain 產生樹狀圖、EXPLAIN FORMAT=JSON (5.6.5+) 獲取成本信息。

版本差異提醒

  • MySQL 5.6+:引入 Using index condition (ICP)、EXPLAIN FOR CONNECTION。
  • MySQL 5.7+:新增 filtered 列、EXPLAIN PARTITIONS 預設開啟。
  • MySQL 8.0+:EXPLAIN ANALYZE 實際執行統計、EXPLAIN FORMAT=TREE 可視化。

熟練讀懂 EXPLAIN,是從「寫出能跑的 SQL」進階到「寫出跑得快的 SQL」的必經之路。

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