| 欄位 | 含義 | 關鍵關注點 |
|---|---|---|
id | 查詢序號 | 相同 id 從上往下執行;id 越大越優先 |
select_type | 查詢類型 | SIMPLE、PRIMARY、UNION、SUBQUERY、DERIVED |
table | 存取的表 | 衍生表顯示 <derivedN> |
partitions | 匹配的分區 | 分區表專用 |
type | 存取類型(效能核心指標) | 見下表,由好到壞 |
possible_keys | 可能用到的索引 | 為 NULL 表示無索引可用 |
key | 實際使用的索引 | 為 NULL 表示全表掃描 |
key_len | 索引長度(位元組) | 推斷聯合索引用了幾個欄位 |
ref | 與索引比較的列/常數 | const、func、欄位名 |
rows | 預估掃描行數 | 越小越好,配合 filtered |
filtered | 按條件過濾後剩餘比例% | 5.7+,越高越好 |
Extra | 額外資訊 | Using index、Using where、Using temporary、Using filesort |
system / const:常數表、主鍵/唯一鍵等值查詢(最快)eq_ref:聯接時用主鍵/唯一鍵(每行匹配 1 行)ref:聯接用普通索引(每行匹配多行)ref_or_null:同 ref,額外處理 NULLindex_merge:索引合併優化unique_subquery / index_subquery:IN 子查詢優化range:範圍查詢(BETWEEN、>、<、IN、LIKE 'prefix%')index:全索引掃描(覆蓋索引時較快)ALL:全表掃描(最慢,需建立索引)EXPLAIN SELECT SUM(`profit`) FROM `sales` a, `company` b WHERE a.`company_id` = b.`id` AND a.`year` = 2006\G -- sales 表:type=ALL, rows=12, key=NULL
CREATE INDEX `idx_sales_year` ON `sales`(`year`);
EXPLAIN SELECT SUM(`profit`) FROM `sales` a, `company` b WHERE a.`company_id` = b.`id` AND a.`year` = 2006\G -- sales 表:type=ref, key=idx_sales_year, rows=3
掃描行數從 12 降至 3,效能提升顯著。
Using index:覆蓋索引,僅讀取索引樹,不回表(極佳)Using where:Server 層過濾(索引未完全覆蓋條件)Using temporary:建立臨時表(GROUP BY、DISTINCT、ORDER BY 不同索引)Using filesort:檔案排序,無索引支援 ORDER BY(需優化)Using join buffer:使用 Join Buffer(Block Nested Loop)Impossible WHERE:WHERE 條件永假(常數折疊)LIMIT 100000, 20 → 覆蓋索引子查詢 + 回表。pt-visual-explain:將 EXPLAIN 輸出為樹狀圖EXPLAIN ANALYZE (MySQL 8.0.18+):實際執行計畫與耗時sys.schema_table_statistics:表級統計EXPLAIN 是 SQL 調優的「聽診器」。熟練解讀 type、key、rows、Extra,配合索引設計、查詢重寫、統計維護,能系統性解決 90% 以上的慢查詢問題。