SQL 優化的本質:在最短時間內以最少的塊言問實現最大數據吞吐量。優化切入點:劣質 SQL 改寫、子查詢轉連接、索引覆蓋、優化器特性利用。
| # | 規則 | 說明 |
|---|---|---|
| 1 | 禁用 SELECT * | 明確列出所需欄位,減少網絡傳輸與 I/O。 |
| 2 | Where 條件前置過濾性強的列 | 過濾率高的條件盡量前置,縮小中間結果集。 |
| 3 | 索引覆蓋查詢 | SELECT 欄位全部包含於複合索引中,避免回表。 |
| 4 | 避免 COUNT(*)/TOP 1 判斷存在性 | 改用 EXISTS 或 LIMIT 1。 |
| 5 | 內層限定原則 | 子查詢/派生表中盡早過濾,減少外層處理量。 |
| 6 | ORDER BY 禁用表達式 | 導致無法使用索引排序,產生 filesort。 |
| 7 | 關聯表控制在 7 個以內 | 超過 7 表優化器排列組合爆炸,建議拆分或冗余。 |
| 8 | IN 列表不超過 200 個值 | 過大 IN 列表優化器可能轉全表掃描。 |
| 9 | 優化比較運算符 | <> 改 < 或 >;> 改 >=;< 改 <=,利用索引範圍掃描。 |
| 10 | 減少多餘列/行讀取 | 只取業務必需的列與行。 |
(F1, F2, F3),查詢必須包含 F1,可為 F1、F1,F2、F1,F2,F3,否則索引失效。SELECT SUM(t1.je) FROM table1 t1, table2 t2, table3 t3 WHERE (t1.等值條件) AND (t1.非等值條件) AND (t2 關聯 t1 條件) AND (t2.等值條件) AND (t2.非等值條件) AND (t3 關聯 t2 條件) AND (t3.等值條件) AND (t3.非等值條件);
原則:先等值後非等值,先本表後關聯表,有利於優化器構建最優連接順序與索引利用。
反例: SELECT name FROM customer WHERE customer_id IN (SELECT customer_id FROM orders WHERE money > 1000)
正例: SELECT c.name FROM customer c INNER JOIN orders o ON c.customer_id = o.customer_id WHERE o.money > 1000
連接可利用索引、避免臨時表、支援更多優化策略。
WHERE SUBSTRING(col,1,3)='abc' → WHERE col LIKE 'abc%')。NOT IN/IN 優先考慮 NOT EXISTS/EXISTS 或 LEFT JOIN ... IS NULL。OPTIMIZE TABLE 或重建。MySQL 效能優化是系統工程,需從 SQL 寫法、索引設計、查詢結構、事務模式、物理架構全鏈路協同。建議建立「慢查詢審核 → EXPLAIN 分析 → 索引調整 → 壓測驗證」閉環機制,持續迭代。