首页/数据/数据库速查/ORDER BY 与索引(消除 filesort)
性能与调优57 条

ORDER BY 与索引(消除 filesort)

排序列与条件列同属一个索引且顺序吻合时,B+ 树天然有序可免排序;升降序混用需 8.0 降序索引支持。

数据库速查数据更新于 2026-10-12

正反例

正反例
-- 索引 (user_id, created_at)
-- 用上排序:WHERE user_id=1 ORDER BY created_at DESC(8.0 可反向扫)
EXPLAIN SELECT * FROM appdb.orders WHERE user_id=1 ORDER BY created_at DESC LIMIT 20;
-- 用不上:WHERE status=1 ORDER BY created_at(status 不在索引前导)
EXPLAIN SELECT * FROM appdb.orders WHERE status=1 ORDER BY created_at LIMIT 20;
规则WHERE 等值列在前 + ORDER BY 列顺延
LIMIT小 LIMIT 可让优化器偏好有序索引
混排ORDER BY a ASC, b DESC 需降序索引(8.0)
排序消除成败看 Extra 是否仍有 Using filesort;LIMIT 小的语句有时 filesort 反而更快,勿一刀切。

易错点

  • 只给 ORDER BY 列建索引:WHERE 条件列没进索引,扫描量爆炸
  • 反向扫描假设不成立(低版本/特定索引类型):8.0 前版本注意升级收益

数据来源与参考

  • MySQL 8.0 Reference Manual: ORDER BY Optimization

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌