同樣的查詢需求,不同寫法效能可能相差數倍。MySQL 提供 EXPLAIN 關鍵字,能在不實際執行查詢的情況下,預覽優化器的執行計畫,包含掃描行數、索引使用狀況、連接順序等關鍵資訊,是 SQL 調優的核心工具。
EXPLAIN SELECT id, username FROM userinfo WHERE username LIKE '%peng%';
| 欄位 | 含義 | 關鍵觀察點 |
|---|---|---|
| id | SELECT 識別碼,查詢序列號 | 數字越大越先執行;相同則由上而下 |
| select_type | 查詢類型 | SIMPLE(無子查詢/UNION)、PRIMARY(最外層)、SUBQUERY、DERIVED(衍生表)等 |
| table | 存取的表名 | 確認是否為預期資料表 |
| type | 連接/存取類型 最重要 | 效能由好到差:system > const > eq_ref > ref > range > index > ALL(全表掃描) |
| possible_keys | 理論上可用的索引 | 若為 NULL,代表無索引可用,需考慮建立索引 |
| key | 實際使用的索引 | 若為 NULL,表示未用到索引 |
| key_len | 索引長度(位元組) | 越短越好;可推斷聯合索引用到第幾個欄位 |
| ref | 與索引比較的欄位或常數 | const、func、欄位名等 |
| rows | 預估掃描行數 | 越小越好;為統計估算值,非精確值 |
| Extra | 額外資訊 關鍵 | Using index(覆蓋索引)、Using where、Using filesort(需外部排序)、Using temporary(建立臨時表) |
id: 1
select_type: SIMPLE
table: userinfo
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 6
Extra: Using where
診斷: type: ALL 表示全表掃描,key: NULL 未使用索引,Extra: Using where 只在 Server 層過濾。若資料量大,效能極差。解決方案:於 username 建立索引,並避免 LIKE '%...%' 導致索引失效。
更詳細的欄位定義請參考 MySQL 官方手冊。掌握 EXPLAIN 讀法,即掌握 SQL 優化的「聽診器」。