| 優化規則 | 轉換前 | 轉換後 |
|---|---|---|
| 消除冗餘括號 | ((a AND b) AND c OR (((a AND b) AND (c AND d)))) | (a AND b AND c) OR (a AND b AND c AND d) |
| 常數傳播 | (a < b AND b = c) AND a = 5 | b > 5 AND b = c AND a = 5 |
| 移除恆真/恆假條件 | (B >= 5 AND B = 5) OR (B = 6 AND 5 = 5) OR (B = 7 AND 5 = 6) | B = 5 OR B = 6 |
| 常數表達式單次計算 | WHERE x > 3+4*2 | 編譯階段算出 11 |
| 單表無 WHERE COUNT(*) | SELECT COUNT(*) FROM t | 直接讀取表統計行數 |
| 早期無效檢測 | SELECT * FROM t WHERE 1=0 | 直接回傳空集,不掃表 |
| HAVING 併入 WHERE | 無 GROUP BY 時 | 等價轉換 |
| 子連結簡化 WHERE | 每個 JOIN 產生簡化條件 | 加速條件評估、提早過濾 |
pk=1)。ORDER BY/GROUP BY 欄位來自同一表 → 該表優先。SQL_SMALL_RESULT → 使用記憶體臨時表。ORDER BY 與 GROUP BY 欄位不一致。ORDER BY/GROUP BY 含非第一張表欄位。DISTINCT + ORDER BY (轉為 GROUP BY 所有欄位)。儲存引擎層在讀取索引時直接評估 WHERE 條件,過濾不符合行,減少回表次數。
-- 極快:單表主鍵/唯一鍵點查
SELECT * FROM t WHERE pk = 1;
-- 極快:索引覆蓋
SELECT id, name FROM t WHERE status = 1; -- INDEX(status, id, name)
-- 極快:索引排序避免 filesort
SELECT * FROM t ORDER BY idx_col LIMIT 10;
-- 極快:聚合函數走索引
SELECT MIN(k), MAX(k) FROM t;
SELECT COUNT(*) FROM t WHERE idx_col = 5;
EXPLAIN 確認 type、key、rows、Extra。Using filesort/Using temporary。STRAIGHT_JOIN 強制)。理解 MySQL WHERE 重寫規則,配合索引設計與 EXPLAIN 驗證,寫出穩定高效的查詢條件。