PROFILING(5.0/5.1.30+)或 EXPLAIN、PERFORMANCE_SCHEMA 精準定位。type、key、rows、Extra(Using index、Using where、Using temporary、Using filesort)。| # | 原則 | 實戰要訣 |
|---|---|---|
| 5 | 多用 Profile | SET profiling=1; 執行 SQL → SHOW PROFILE FOR QUERY n; 看 CPU/IO/鎖/網路分布 |
| 6 | 小結果集驅動大結果集 | JOIN 時小表在前、大表在後;STRAIGHT_JOIN 強制順序;EXISTS/IN 選擇小表做子查詢 |
| 7 | 在索引中完成排序 | ORDER BY 列加入複合索引尾部;避免 Using filesort |
| 8 | 只取需要的 Columns | 禁用 SELECT *;覆蓋索引 INDEX (a,b,c) 滿足 SELECT a,b FROM t WHERE c=1 |
| 9 | 僅用最高效過濾條件 | 高選擇性條件前置;避免 OR 導致索引失效;LIKE 'abc%' 走索引,LIKE '%abc' 不走 |
| 10 | 避免複雜 JOIN 與子查詢 | 子查詢改 JOIN 或 CTE(8.0+);大表關聯拆分為應用層組裝;衍生表物化成本高 |
-- 原始:全表掃描 + filesort
SELECT * FROM orders WHERE user_id=123 ORDER BY created_at DESC LIMIT 20;
-- 優化:複合索引覆蓋
ALTER TABLE orders ADD INDEX idx_uid_created (user_id, created_at DESC);
-- EXPLAIN 顯示 type=ref, key=idx_uid_created, Extra=Using index
優化前:rows=500000, Using where; Using filesort
優化後:rows=20, Using index
併發 500 QPS 時,CPU 從 85% 降至 12%,延遲從 800ms 降至 3ms。
EXPLAIN FORMAT=JSON(5.6+):輸出成本估算與優化器決策細節。OPTIMIZER_TRACE:SET optimizer_trace="enabled=on"; 追蹤為何不走索引。sys.schema_table_statistics / sys.schema_index_statistics:熱點表/索引一覽。pt-query-digest(Percona Toolkit):慢查詢日誌聚合分析,找出 Top N 消耗資源語句。ALTER TABLE 大表 → 鎖表停服務(用 pt-online-schema-change 或 8.0 Instant DDL)。ANALYZE TABLE 定期執行。優化是「減法藝術」:減少掃描行、減少回表、減少排序、減少鎖、減少網路往返。每一次 EXPLAIN 都是與優化器的對話,聽懂它的語言,才能寫出極致 SQL。