SQL 語義等價不代表性能等價。本文提煉 5 條高收益優化技巧:數據類型收斂、字符集隱式轉換消除、COUNT 優化、子查詢轉 JOIN、UNION ALL 替代 UNION,附原理與適用場景。
NOT NULL DEFAULT 0/-1/''。TINYINT 代替 INT 存枚舉,DATE 代替 DATETIME 存生日,DECIMAL(10,2) 存金額避免浮點誤差。ALTER TABLE 鎖表重建。utf8mb4、表 latin1、列 gbk → 每次交互觸發轉換,CPU 損耗 + 索引失效風險。utf8mb4,驅動 URL 顯式指定 characterEncoding=utf8mb4。SHOW VARIABLES LIKE 'character_set%' 定期巡檢一致性。| 引擎 | 無 WHERE | 有 WHERE |
|---|---|---|
| MyISAM | O(1) 直接讀元數據 | 全掃/索引掃 |
| InnoDB | 全掃聚簇索引 | 全掃/索引掃 |
SHOW TABLE STATUS Rows,**精確值** 建計數表 + 觸發器維護或定時任務刷新。COUNT(col):INDEX (col, pk) 讓掃描僅走二級索引。-- 子查詢(可能物化/半連接,版本依賴) SELECT * FROM t1 WHERE id IN (SELECT t1_id FROM t2 WHERE status=1); -- 等價 JOIN(穩定走 Nested Loop / Hash Join) SELECT t1.* FROM t1 JOIN t2 ON t1.id = t2.t1_id WHERE t2.status=1;
t2.t1_id)。WITH) 可讀性更佳,執行計劃等價。UNION = UNION ALL + DISTINCT(全量排序/哈希去重)。UNION ALL,性能提升 50%+。Set)替代數據庫排序,將壓力前移。slow_query_log(long_query_time=0 全采集)。pt-query-digest 產出 Top SQL。EXPLAIN ANALYZE (8.0.18+) 觀察實際執行統計。