MySQL 查詢最佳化器對 WHERE 子句執行一系列自動重寫與優化。理解這些機制有助於撰寫高效 SQL 並預測執行計畫。本文系統整理官方文件中的核心優化規則。
((a AND b) AND c) → (a AND b AND c)(a < b AND a = 5) → (b > 5 AND a = 5)(B>=5 AND B=5) → B=5;(B=7 AND 5=6) → 移除NOT NULL 條件同理。最佳化器優先讀取「常數表」,類型包括:
PRIMARY KEY 或 UNIQUE 索引之 WHERE 條件 (所有索引欄位為常數運算式且 NOT NULL)。範例:SELECT * FROM t WHERE primary_key=1、SELECT * FROM t1,t2 WHERE t1.pk=1 AND t2.pk=t1.id。
ORDER BY 與 GROUP BY 欄位來自同一表,該表優先聯結。SQL_SMALL_RESULT 提示 → 使用記憶體臨時表。ORDER BY 與 GROUP BY 不一致、或涉及非第一張表欄位 → 建立磁碟臨時表。DISTINCT 轉為全欄位 GROUP BY,搭配 ORDER BY 常觸發臨時表。每列輸出前評估 HAVING,不符合者直接跳過,減少網路傳輸。
SELECT COUNT(*) FROM tbl_name
SELECT MIN(key_part1), MAX(key_part1) FROM tbl_name
SELECT MAX(key_part2) FROM tbl_name WHERE key_part1 = constant
SELECT ... FROM tbl_name ORDER BY key_part1, key_part2 LIMIT 10
SELECT ... FROM tbl_name ORDER BY key_part1 DESC, key_part2 DESC LIMIT 10
MySQL WHERE 優化核心在於**「常數傳播簡化邏輯」、「常數表優先聯結」、「30% 索引閾值」、「覆蓋索引避免回表」、「臨時表策略」**。善用 EXPLAIN 驗證執行計畫,配合 LIMIT、SQL_SMALL_RESULT、覆蓋索引設計,可榨乾查詢效能。