首页/数据/SQL 速查/ORDER BY 走索引消除排序
性能与执行计划72 条

ORDER BY 走索引消除排序

排序结果与索引顺序一致时可直接按序读索引:关注 EXPLAIN 是否出现排序步骤与回表代价。

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

示例

示例
-- idx_user_created (user_id, created_at)
SELECT id, total
FROM orders
WHERE user_id = 100
ORDER BY created_at DESC
LIMIT 10;

-- TREE 输出中按索引反向取数(无 Sort 节点):
-- Index lookup on orders using idx_user_created (user_id=100) (reverse)

-- 无法利用索引(排序键与索引顺序不一致)
SELECT id FROM orders ORDER BY total DESC LIMIT 10;
方向ORDER BY 的列序列需与索引一致;MySQL 8.0 混向排序需降序索引支持
LIMIT 收益按序扫描配合 LIMIT 只需读少量行,避免全量排序
两库差异PostgreSQL 可反向扫描索引;需精确匹配排序方向与 NULLS 顺序时要对应定义索引

易错点

  • 以为 ORDER BY 有索引就一定免排序:索引与排序键不一致(含方向混用)时仍会出现 Sort 步骤
  • 低区分度列按序翻页:即使走索引,回表成本也可能让优化器改回全扫描加排序

数据来源与参考

  • MySQL 8.0 Reference Manual §8.3.1 How MySQL Uses Indexes
  • PostgreSQL Documentation §11.4 Indexes and ORDER BY
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌