首页/数据/SQL 速查/降序索引(MySQL 8.0)
性能与执行计划72 条

降序索引(MySQL 8.0)

8.0 起支持真正的降序索引:多列混合排序方向(如 a ASC, b DESC)可被索引直接满足,避免额外排序。

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

降序索引解决什么

MySQL 8.0 起支持真正的降序索引:建索引时可以写「a ASC, b DESC」这样的混合方向,让多列混合排序直接被索引满足,省掉额外排序步骤。8.0 之前 DESC 关键字会被解析但忽略,混合方向排序只能靠额外排序完成。

基本信息

适用版本MySQL 8.0+
语法索引定义里写 ASC / DESC,例如 (a ASC, b DESC)
单列降序更早版本也能通过反向扫描索引实现
真正需要降序索引多列排序方向不一致的场景
验证方式EXPLAIN 里确认没有额外排序步骤

典型使用场景

  • 列表页按「创建时间倒序加 ID 正序」排序
  • 排行榜按分数降序、并列时按时间正序
  • 多维度混合排序的报表
  • 排查 ORDER BY 引起的排序开销
  • 索引设计评审时确认排序方向是否匹配

示例

示例
-- 混合方向的降序索引
ALTER TABLE events
  ADD INDEX idx_a_asc_b_desc (a ASC, b DESC);

-- 排序方向与索引一致,可直接借用索引顺序
SELECT * FROM events ORDER BY a ASC, b DESC LIMIT 20;

-- 方向不一致时会退化成额外排序
SELECT * FROM events ORDER BY a ASC, b ASC LIMIT 20;

-- 用 EXPLAIN 确认没有额外排序
EXPLAIN SELECT * FROM events ORDER BY a ASC, b DESC LIMIT 20;

索引方向与排序

索引定义排序写法能否直接用索引
(a ASC, b DESC)ORDER BY a ASC, b DESC可以
(a ASC, b DESC)ORDER BY a ASC, b ASC不能,需额外排序
(a DESC)ORDER BY a DESC可以
(a ASC)ORDER BY a DESC可以(反向扫描)
(a ASC, b ASC)ORDER BY a DESC, b DESC可以(整体反向扫描)
单列降序通常不需要降序索引:优化器可以反向扫描普通索引。降序索引真正解决的是多列排序方向不一致,或正反混合扫描无法满足的顺序。
旧版本上写 DESC 不会报错但也不生效:5.7 及更早版本会忽略这个关键字,实际索引方向与预期不一致,升级或评审时要留意。
降序索引不影响自身维护开销,但为每个排序组合都加索引会明显拖慢写入:先确认排序模式是否稳定,再决定加几条。
分页查询最容易暴露排序问题:排序方向与索引对齐之后,翻页时的排序开销与深分页代价通常也会一起下降。

易错点

  • 以为单列降序一直需要降序索引:反向扫描同样可用,降序索引解决的是混合方向问题
  • 在旧版本沿用降序语法:5.7 及更早会忽略 DESC,实际计划与预期不符
  • 索引方向与 ORDER BY 不一致:多列排序方向不匹配时会退化成额外排序
  • 只看语法不看计划:建完索引仍可能有排序步骤,要用 EXPLAIN 验证
  • 为每个排序组合都建一条索引:索引数量增加会抬高写入成本,先确认排序模式是否稳定

数据来源与参考

  • MySQL 8.0 Reference Manual · Descending Indexes
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌