SQL 語句優化是資料庫效能調優的核心環節。本文系統整理 14 大優化原則,涵蓋索引策略、查詢重寫、資料類型選擇、EXPLAIN 分析等實戰技巧,並附上實測數據對比,助你撰寫高效能 SQL。
>, <, BETWEEN)、ORDER BY/GROUP BY 的欄位WHERE 條件中欄位與常數類型不一致會導致隱含轉換,使索引失效。例:VARCHAR 欄位 = 數字 會全表掃描。
任何索引皆可協助 ORDER BY/GROUP BY 效能,但需符合最左前綴。
錯誤:WHERE YEAR(create_time) = 2024(索引失效)
正確:WHERE create_time >= '2024-01-01' AND create_time < '2025-01-01'
IN、OR 常觸發臨時表導致索引失效。若值較少且不產生大量重複,可拆分為多條 UNION ALL 查詢。
TINYINT (1B) > SMALLINT (2B) > MEDIUMINT (3B) > INT (4B) > BIGINT (8B)CHAR 適合固定長度(如 MD5、UUID),VARCHAR 需額外 1-2 位元組記錄長度NULL 需額外位元組標記,且索引統計、比較運算較複雜。有預設值用預設值,無則 NOT NULL DEFAULT '' 或 0。
大欄位導致行溢出、離頁儲存,增加 I/O。必要時拆分至獨立表(垂直分表)。
性別、狀態、類別等固定少量值,ENUM 內部以整數儲存,效能接近 TINYINT。
測試環境:37,365 筆會員資料,username 欄位建立前綴索引 username(6)
| 查詢語句 | 無索引 (秒) | 有索引 (秒) | 提升倍數 |
|---|---|---|---|
LIKE '%許%' | 0.54 平均 | 0.34 平均 | 1.6x |
LIKE '許%' | 0.53 平均 | 0.065 平均 | 8.2x |
LIKE '%許' | 0.51 平均 | 0.315 平均 | 1.6x |
結論: 前綴匹配 LIKE '關鍵字%' 受惠於索引最大,通配符開頭 %...% 無法使用索引。
索引建立在 JOIN ON 條件欄位 + WHERE 過濾欄位上。多表查詢更能體現索引優勢。
username(6)),最長 255 字符WHERE a=1 AND b=2 → 索引 (a,b);WHERE a=1 ORDER BY b → 索引 (a,b)-- 假設 idx_a(a), idx_b(b)
SELECT * FROM t WHERE a=1 AND b=2; -- 使用索引 (index merge 或複合索引)
SELECT * FROM t WHERE a=1 OR b=2; -- 通常全表掃描,除非改寫為 UNION
頻繁 INSERT、極少 SELECT 的日誌、監控表,索引維護成本可能超過查詢收益。
關注關鍵欄位:
type:system > const > eq_ref > ref > range > index > ALL(越前越好)key:實際使用的索引rows:預估掃描行數(越少越好)Extra:Using index(覆蓋索引)、Using where、Using temporary、Using filesort(需優化)SQL 優化無銀彈,核心在於「理解執行計畫、針對瓶頸精準施策」。建立索引、重寫查詢、調整資料類型、定期 ANALYZE TABLE 更新統計資訊,配合監控慢查詢日誌,持續迭代優化,才能維持資料庫長期高效能運行。