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

MySQL ORDER BY 優化:索引下推與文件排序避坑指南

     編輯:MySQL 綜合教學

核心原則:索引順序匹配排序順序

MySQL 可利用索引直接滿足 ORDER BY/GROUP BY,避免 Using filesort,前提是:

  • 索引列順序與 ORDER BY 列順序一致(或為前綴匹配)
  • 所有非索引列在 WHERE 條件中為常量過濾
  • 排序方向一致(全 ASC 或全 DESC)

可使用索引的典型模式

-- 1. 純索引排序
SELECT * FROM t1 ORDER BY key_part1, key_part2;

-- 2. WHERE 常量過濾 + 索引排序
SELECT * FROM t1 WHERE key_part1 = 10 ORDER BY key_part2;

-- 3. 組合索引前綴過濾 + 後綴排序
SELECT * FROM t1 WHERE key_part1 = 10 GROUP BY key_part2;

-- 4. 全 DESC 排序
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC;

無法使用索引的 5 大場景

場景示例原因
多索引混合排序ORDER BY key1, key2非同一組合索引
非連續索引列WHERE key2=1 ORDER BY key_part2跳過 key_part1 破壞前綴
混合 ASC/DESCORDER BY key1 DESC, key2 ASC索引無法雙向掃描
過濾列與排序列不同索引WHERE key2=1 ORDER BY key1需回表再排序
非順序存儲引擎HEAP/MEMORY 表Hash 索引無序

驗證方法:EXPLAIN 觀察 Extra 列

  • Using index:覆蓋索引,無回表、無排序
  • Using filesort:觸發文件排序,性能隱患
  • Using temporary; Using filesort:臨時表+排序,最慢

基數與選擇性

索引基數 = 不同值數量。基數/總行數 > 30% 時優化器傾向使用索引;性別、狀態等低基數列(<1%),全表掃描反而更快。

優化實戰技巧

  1. 組合索引設計:WHERE 等值列在前,ORDER BY 列在後,如 INDEX (status, created_at)
  2. 強制索引:FORCE INDEX (idx_xxx) 干預優化器(慎用)
  3. 增加 sort_buffer_size:適當調大減少臨時文件 I/O
  4. Limit 優化:ORDER BY id LIMIT 10 配合主鍵索引極快
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved