EXPLAIN 顯示 MySQL 如何利用索引處理 SELECT 與連接表,是撰寫高效查詢、選擇優質索引的核心工具。
EXPLAIN SELECT surname, first_name FROM a, b WHERE a.id = b.id;
| 欄位 | 說明 |
|---|---|
table | 該行資料涉及的資料表 |
type | 關鍵欄位,連接類型,效率由高到低:system > const > eq_ref > ref > range > index > ALL |
possible_keys | 可能使用的索引;為空表示無可用索引 |
key | 實際使用的索引;NULL 表示未使用索引。可用 USE INDEX 強制或 IGNORE INDEX 忽略 |
key_len | 使用索引長度;不失精度下越短越好 |
ref | 索引的哪一欄被使用,可能為常數 |
rows | MySQL 預估需掃描的行數 |
Extra | 額外資訊。壞訊號:Using temporary、Using filesort 表示無法用索引,查詢極慢 |
Distinct:找到第一匹配行即停止搜尋Not exists:LEFT JOIN 優化,找到匹配行即停止Range checked for each Record (index map:#):無理想索引,極慢Using filesort:需額外排序步驟,**需優化**Using index:僅從索引取得資料(覆蓋索引),效能佳Using temporary:建立臨時表,**需優化**Where used:使用 WHERE 限制匹配行system:表僅一行(系統表)const:主鍵/唯一索引查單行,視為常數eq_ref:連接時每前表行精確匹配一行,用於主鍵/唯一鍵ref:非唯一鍵或最左前綴,匹配行數越少越好range:索引範圍掃描(>、<、BETWEEN)index:全索引掃描(優於 ALL)ALL:全表掃描,**極差,應避免**