EXPLAIN 是 MySQL 效能調優的核心工具。本文系統解讀各輸出欄位含義,從最優到最差的 type 類型、關鍵欄位 key/rows/Extra 解讀,助你快速定位慢查詢根因。
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
SIMPLE:無 UNION/子查詢的簡單 SELECTPRIMARY:最外層查詢UNION:UNION 中第二或之後的 SELECTDEPENDENT UNION:依賴外部查詢的 UNIONUNION RESULT:UNION 結果集SUBQUERY:子查詢DEPENDENT SUBQUERY:相關子查詢DERIVED:衍生表 (FROM 子查詢)| 類型 | 說明 |
|---|---|
system | 表僅一行 (系統表),const 特例 |
const | 最多一行匹配,查詢開始即讀取;用於 PK/Unique 索引所有部分與常數比較 |
eq_ref | 唯一索引掃描,JOIN 時每行匹配一行;最優 JOIN 類型 |
ref | 非唯一索引或最左前綴匹配,JOIN 時可能匹配多行 |
ref_or_null | 類似 ref,額外搜尋 NULL 值;子查詢優化常見 |
index_merge | 索引合併優化 (多索引交集/聯集) |
unique_subquery | 替換 IN (SELECT PK ...) 子查詢,效率更高 |
index_subquery | 替換 IN (SELECT non-PK ...) 子查詢 |
range | 索引範圍掃描 (BETWEEN, IN, >, < 等) |
index | 全索引樹掃描,性質接近 ALL |
ALL | 全表掃描,最差情況 |
possible_keys:可能用到的索引key:實際使用的索引 (為 NULL 表示無索引可用)key_len:使用的索引長度 (判斷複合索引用了幾列)ref:與 key 配合的比較值 (常數/欄位/函數)rows:預估掃描行數 (越小越好)Extra:額外資訊 (如 Using where、Using index (覆蓋索引)、Using temporary、Using filesort 等)type:至少達 ref,避免 ALL/indexkey:是否命中預期索引rows:預估掃描行數是否合理Extra:出現 Using filesort/Using temporary 需優化善用 EXPLAIN,讓索引優化有的放矢。