SQL优化-索引扫描

📅 2026/7/3 4:04:39 👁️ 阅读次数 📝 编程学习
SQL优化-索引扫描

Backward index scan 是什么意思?

在 MySQL(尤其是 8.0 的EXPLAIN FORMAT=TREE/EXPLAIN ANALYZE)里,Backward index scan 表示:

优化器沿索引反向读取数据(从大到小),用来满足ORDER BY ... DESC或某些反向范围条件,从而避免额外排序(filesort)。


1. 和正向扫描对比

类型含义典型场景

Index scan(正向)

从索引小 → 大读

ORDER BY start_time ASC

Backward index scan(反向)

从索引大 → 小读

ORDER BY start_time DESC

例如索引(start_time)

-- 可能:Forward index scan,从小到大

ORDER BY start_time ASC

-- 可能:Backward index scan,从大到小

ORDER BY start_time DESC


2. 为什么有用

若 WHERE 能用上该索引,且 ORDER BY 方向与扫描方向一致,MySQL 可以:

Index (range) scan backward

→ 结果已经按 DESC 有序

→ 不需要 Sort / filesort

执行计划里若看到 Backward index scan,通常是好信号(比全表扫 + Sort 好)。


3. 计划里可能长什么样

-> Index range scan (backward) on t using idx_start_time

(cost=... rows=...)

或:

-> Backward index scan on idx_start_time


4. 什么时候不会出现

即使有索引,也可能没有 Backward index scan,例如你之前那条 SQL:

  • verification_result != '0000'过滤选择性差
  • 优化器认为全表扫更便宜
  • ORDER BY 列和索引列不一致(如索引在start_time,却ORDER BY create_time

这时计划会是 Table scan + Sort,而不是 Backward index scan。


5. 和「倒序索引」的区别

  • Backward index scan:运行时反向读现有 B+Tree 索引,不必建DESC索引。
  • MySQL 8.0 也支持索引定义里写DESC

CREATE INDEX idx ON t (start_time DESC);

对 InnoDB 来说,8.0 起正/反序索引能力更完整,但很多时候正向索引 + backward scan 就够用了。


6. 一句话

Backward index scan = 索引倒着扫,用来直接得到 DESC 顺序,省掉排序。

若你希望风控告警那条 SQL 出现它,需要:WHERE 能走索引(尤其时间范围)+ ORDER BY 与索引列一致(如start_time DESC)+ 合适的复合索引,而不是只有单列索引却全表扫。