| 欄位 | 含義 | 調優決策參考 |
|---|---|---|
id | SELECT 查詢序號 | 相同 id 順序執行;id 大的優先 (子查詢/衍生表) |
select_type | 查詢類型 | 見下文 8 大類型對照表 |
table | 存取表名 | <derivedN> 衍生表、<unionM,N> 聯合結果 |
type | 存取策略 ★核心指標★ | system > const > eq_ref > ref > range > index > ALL |
possible_keys | 候選索引 | NULL = 無索引可用,檢查 WHERE/ON/JOIN 條件 |
key | 實際使用索引 | 可用 FORCE/USE/IGNORE INDEX 干預 |
key_len | 索引長度 (字節) | 推斷複合索引用到第幾列;越短越好 |
ref | 比較引用 | const/列名/函數,配合 key 理解匹配方式 |
rows | 預估掃描行數 | InnoDB 為統計估算,越小越好 |
Extra | 額外資訊 ★關鍵線索★ | 見下文關鍵值對照 |
| 類型 | 含義 | 典型場景 |
|---|---|---|
| SIMPLE | 簡單查詢,無 UNION/子查詢 | SELECT * FROM t |
| PRIMARY | 最外層查詢 | 包含子查詢的主查詢 |
| UNION | UNION 第 2+ 個 SELECT | SELECT 1 UNION SELECT 2 |
| DEPENDENT UNION | 依賴外部查詢的 UNION | SELECT * FROM t WHERE id IN (SELECT... UNION SELECT...) |
| UNION RESULT | UNION 結果合併 | 臨時表合併去重 |
| SUBQUERY | 子查詢第一個 SELECT | SELECT * FROM t WHERE id = (SELECT...) |
| DEPENDENT SUBQUERY | 依賴外部查詢的子查詢 | SELECT * FROM t WHERE id IN (SELECT...) |
| DERIVED | FROM 子查詢衍生表 | SELECT * FROM (SELECT...) 物化到臨時表 |
system (表僅 1 行)
> const (PK/UK 唯一查找,最多 1 行)
> eq_ref (JOIN 時用 PK/UK,每行匹配 1 行)
> ref (非唯一索引查找,或複合索引最左前綴)
> fulltext (全文索引)
> ref_or_null (ref + NULL 補充)
> index_merge (索引合併)
> unique_subquery (IN 子查詢主鍵)
> index_subquery (IN 子查詢索引)
> range (索引範圍掃描:>, <, >=, <=, BETWEEN, IN, LIKE 'prefix%')
> index (全索引掃描,不回表)
> ALL (全表掃描,最差)
及格線: 至少 range,目標 ref/eq_ref/const。
| Extra 值 | 含義 | 嚴重度 | 優化方向 |
|---|---|---|---|
| Using index | 覆蓋索引,僅掃描索引樹 | 🟢 優 | 維持/擴展覆蓋索引 |
| Using where | Server 層過濾 (存儲引擎返回後) | 🟡 常態 | 推動條件下推 (ICP)、建立索引 |
| Using index condition (ICP) | 存儲引擎層過濾 (5.6+) | 🟢 優 | 確保複合索引順序正確 |
| Using filesort | 需額外排序 (無索引支援 ORDER BY) | 🔴 危 | 建立符合 ORDER BY 的索引、限制結果集 |
| Using temporary | 需建臨時表 (GROUP BY/DISTINCT/UNION) | 🔴 危 | 索引優化、避免大結果集、調大 tmp_table_size |
| Using join buffer (Block Nested Loop) | Join 無索引,用 Join Buffer | 🔴 危 | 為 JOIN 條件列建立索引 |
| Impossible WHERE | WHERE 條件永假,優化器直接返回空 | 🟡 提示 | 檢查業務邏輯、常數條件 |
| Select tables optimized away | 聚合函數優化 (如 MIN/MAX 走索引) | 🟢 優 | 無需干預 |
ALL/index?→ 是 → 檢查 possible_keys 是否為 NULL → 建立索引FORCE INDEX 或調整條件順序/類型ANALYZE TABLEUsing filesort/Using temporary?→ 是 → 索引覆蓋 ORDER BY/GROUP BY、拆分查詢const/列名?→ 函數/表達式 → 索引失效風險DERIVED 類型表示子查詢結果物化到臨時表。5.6+ 支援 derived_merge 優化 (預設開啟),將衍生表「合併」到外層查詢,避免物化開銷。若需強制物化:SELECT /*+ NO_MERGE(dt) */ * FROM (SELECT...) dt。
EXPLAIN 是調優的「聽診器」。熟記 type 階梯、Extra 紅綠燈、select_type 分類,內化「看 type → 看 key → 看 rows → 看 Extra」四步診斷法,配合 ANALYZE TABLE 維護統計信息、OPTIMIZE TABLE 整理碎片、慢查詢日誌例行 pt-query-digest 分析,即可構建從「被動滅火」到「主動把脈」的資料庫效能管理體系。