首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL WHERE 條件優化規則完整解析:從括號消除到索引下推

     編輯:MySQL 資料庫相關知識

MySQL 內建 WHERE 重寫優化

優化規則轉換前轉換後
消除冗餘括號((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 = 5b > 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 產生簡化條件加速條件評估、提早過濾

常數表識別與優先讀取

  • 空表或 1 行表。
  • 唯一索引/主鍵所有欄位以常數比較 (pk=1)。
  • 此類表在 JOIN 時優先讀取,減少後續連結成本。

JOIN 順序優化

  • 嘗試所有排列組合選擇最低成本 (指數級,大表啟用贏家剪枝)。
  • ORDER BY/GROUP BY 欄位來自同一表 → 該表優先。
  • SQL_SMALL_RESULT → 使用記憶體臨時表。

臨時表觸發條件

  • ORDER BY 與 GROUP BY 欄位不一致。
  • ORDER BY/GROUP BY 含非第一張表欄位。
  • DISTINCT + ORDER BY (轉為 GROUP BY 所有欄位)。

索引使用決策

  • 掃描比例 < 30% → 使用索引。
  • 否則全表掃描更快。
  • 覆蓋索引 (所有查詢欄位在索引中) → 僅讀索引樹,不回表。

索引下推 (ICP, MySQL 5.6+)

儲存引擎層在讀取索引時直接評估 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;

優化檢查清單

  1. EXPLAIN 確認 type、key、rows、Extra。
  2. WHERE 條件欄位是否有索引支援。
  3. 是否觸發 Using filesort/Using temporary。
  4. 常數條件是否可下推/傳播。
  5. 大表 JOIN 順序是否最優 (必要時 STRAIGHT_JOIN 強制)。

理解 MySQL WHERE 重寫規則,配合索引設計與 EXPLAIN 驗證,寫出穩定高效的查詢條件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved