在 MySQL 資料庫開發與維護中,查詢效能優化是核心課題之一。本文將深入介紹如何使用 EXPLAIN 陳述式分析 SQL 執行計畫,並說明常見的優化策略與 WHERE 子句優化機制,協助開發者快速定位效能瓶頸,編寫高效率的查詢語句。
在 SELECT 陳述式前加上 EXPLAIN 關鍵字,MySQL 將回傳該查詢的執行計畫,包含資料表聯結順序、索引使用情況、預估掃描行數等關鍵資訊。透過分析輸出結果,開發者可判斷是否需要新增索引、調整查詢邏輯或重寫 SQL。
| 欄位 | 說明 |
|---|---|
table | 該行輸出所參考的資料表名稱 |
type | 聯結類型,由佳到差依序為:system、const、eq_ref、ref、range、index、ALL。ALL 代表全表掃描,效能最差 |
possible_keys | 查詢可能使用的索引 |
key | 實際使用的索引;若為 NULL 則未使用索引 |
key_len | 實際使用索引的長度(位元組),可判斷複合索引使用了幾個欄位 |
ref | 與索引搭配使用的欄位或常數 |
rows | 預估需掃描的行數;將所有行的 rows 相乘可粗估聯結總掃描量 |
Extra | 額外資訊:Using index 表示覆蓋索引(僅掃描索引樹),Using where 表示 WHERE 子句過濾 |
EXPLAIN SELECT student.name FROM student, pet WHERE student.name = pet.owner;
輸出顯示兩張表皆為 type=ALL(全表掃描),key=NULL,表示未使用索引。此時應在 student.name 與 pet.owner 上建立索引,將聯結類型優化為 ref 或 eq_ref,大幅降低 rows 預估值。
SELECT ... WHERE 緩慢時,首要動作是評估是否可新增索引。跨表關聯欄位(JOIN ON、WHERE 條件)均應建立索引。ANALYZE TABLE:資料載入後執行 myisamchk --analyze 或 ANALYZE TABLE,更新索引統計資訊,協助優化器做出更佳決策。myisamchk --sort-index --sort-records=1 將資料依索引順序重組,加速範圍查詢與 ORDER BY。MySQL 在查詢解析階段會自動套用多項改寫規則,以下列舉常見優化:
((a AND b) AND c) → (a AND b AND c)a < b AND b = c AND a = 5 → b > 5 AND b = c AND a = 5(B >= 5 AND B = 5) → B = 5WHERE 1=0 直接回傳空結果。GROUP BY 時,HAVING 等同 WHERE。Using index),避免回表。ORDER BY key LIMIT 10 可直接利用索引順序取得前 N 筆,省去排序。| 查詢模式 | 特點 |
|---|---|
SELECT COUNT(*) FROM tbl | MyISAM 瞬間完成 |
SELECT MIN/MAX(key) FROM tbl | 直接走索引最左/最右節點 |
SELECT ... WHERE key_part1=const ORDER BY key_part2 LIMIT 10 | 索引範圍掃描 + 排序已滿足 |
SELECT key_part1, key_part2 FROM tbl WHERE key_part1=val | 覆蓋索引,無需回表 |
掌握 EXPLAIN 輸出解讀、善用索引覆蓋、理解優化器內建改寫規則,是撰寫高效能 MySQL 查詢的三大基石。建議開發者養成「先 EXPLAIN,後上線」的習慣,並定期執行 ANALYZE TABLE 維護統計資訊,讓優化器始終擁有最新的決策依據。