首页/数据/SQL 速查/消除排序步骤的常见手法
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条变更与事务52 条
性能与执行计划72 条

消除排序步骤的常见手法

让 ORDER BY 能按索引顺序取数:列序列、方向、条件都要匹配;否则数据库要收集后排序。

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

示例

示例
ALTER TABLE orders ADD INDEX idx_user_created (user_id, created_at);

-- 可避免排序:等值列加排序列与索引一致
EXPLAIN SELECT * FROM orders
WHERE user_id = 100
ORDER BY created_at DESC
LIMIT 20;

-- 会引入排序:排序键与索引顺序不一致
EXPLAIN SELECT * FROM orders
WHERE user_id = 100
ORDER BY total DESC
LIMIT 20;   -- Using filesort / Sort 节点
匹配要点WHERE 用索引前导列、ORDER BY 接续剩余列且方向一致
小 LIMIT排序无法避免时,尽量缩小参与排序的行数
表达式排序ORDER BY 表达式无法用普通索引,需要函数索引或改写

易错点

  • 只看“有没有排序”不看代价:小结果集排序可能比强制走索引更快,以 EXPLAIN 实际选择为准
  • 把 ORDER BY 随便改成按主键排序:业务语义改变,可能返回错误的数据顺序

数据来源与参考

  • MySQL 8.0 Reference Manual · ORDER BY Optimization
  • PostgreSQL Documentation §11.4 Indexes and ORDER BY
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌