首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL SQL 語句優化核心原則:索引設計、查詢重寫與效能調優實戰

     編輯:MySQL 綜合教學

SQL 語句優化是資料庫效能調優的核心環節。本文系統整理 14 大優化原則,涵蓋索引策略、查詢重寫、資料類型選擇、EXPLAIN 分析等實戰技巧,並附上實測數據對比,助你撰寫高效能 SQL。

核心優化原則

1. 善用索引加速查詢

  • 叢集索引:適合大量重複值、頻繁範圍查詢(>, <, BETWEEN)、ORDER BY/GROUP BY 的欄位
  • 複合索引:多欄位常一起查詢時建立,最左前綴原則:最常用的欄位放最左邊
  • 索引覆蓋:查詢欄位全包含於索引中,避免回表
  • 適度原則:索引非越多越好,每新增索引都增加 INSERT/UPDATE/DELETE 維護成本

2. 大量查詢避免隱含轉換

WHERE 條件中欄位與常數類型不一致會導致隱含轉換,使索引失效。例:VARCHAR 欄位 = 數字 會全表掃描。

3. ORDER BY / GROUP BY 善用索引

任何索引皆可協助 ORDER BY/GROUP BY 效能,但需符合最左前綴。

4. 將運算移至等號右側

錯誤:WHERE YEAR(create_time) = 2024(索引失效)
正確:WHERE create_time >= '2024-01-01' AND create_time < '2025-01-01'

5. 謹慎使用 IN / OR

IN、OR 常觸發臨時表導致索引失效。若值較少且不產生大量重複,可拆分為多條 UNION ALL 查詢。

6. 選擇最小足夠的資料類型

  • 整數:TINYINT (1B) > SMALLINT (2B) > MEDIUMINT (3B) > INT (4B) > BIGINT (8B)
  • 定長優於變長:CHAR 適合固定長度(如 MD5、UUID),VARCHAR 需額外 1-2 位元組記錄長度

7. 欄位盡量 NOT NULL

NULL 需額外位元組標記,且索引統計、比較運算較複雜。有預設值用預設值,無則 NOT NULL DEFAULT '' 或 0。

8. 減少 VARCHAR/TEXT/BLOB 使用

大欄位導致行溢出、離頁儲存,增加 I/O。必要時拆分至獨立表(垂直分表)。

9. 低基數枚舉值用 ENUM

性別、狀態、類別等固定少量值,ENUM 內部以整數儲存,效能接近 TINYINT。

10. 實測:索引對 LIKE 查詢的影響

測試環境: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 '關鍵字%' 受惠於索引最大,通配符開頭 %...% 無法使用索引。

11. 多表查詢索引策略

索引建立在 JOIN ON 條件欄位 + WHERE 過濾欄位上。多表查詢更能體現索引優勢。

12. 索引建立實戰原則

  • 前綴索引:重複度低的前綴長度(如 username(6)),最長 255 字符
  • 複合索引順序:WHERE a=1 AND b=2 → 索引 (a,b);WHERE a=1 ORDER BY b → 索引 (a,b)
  • 索引建在查詢條件欄位,而非 SELECT 輸出欄位

13. IN/OR 索引失效實例

-- 假設 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

14. 寫入密集型表慎加索引

頻繁 INSERT、極少 SELECT 的日誌、監控表,索引維護成本可能超過查詢收益。

診斷工具:EXPLAIN 深度解析

關注關鍵欄位:

  • type:system > const > eq_ref > ref > range > index > ALL(越前越好)
  • key:實際使用的索引
  • rows:預估掃描行數(越少越好)
  • Extra:Using index(覆蓋索引)、Using where、Using temporary、Using filesort(需優化)

總結

SQL 優化無銀彈,核心在於「理解執行計畫、針對瓶頸精準施策」。建立索引、重寫查詢、調整資料類型、定期 ANALYZE TABLE 更新統計資訊,配合監控慢查詢日誌,持續迭代優化,才能維持資料庫長期高效能運行。

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