SQL优化-索引扫描
Backward index scan 是什么意思?
在 MySQL(尤其是 8.0 的EXPLAIN FORMAT=TREE/EXPLAIN ANALYZE)里,Backward index scan 表示:
优化器沿索引反向读取数据(从大到小),用来满足
ORDER BY ... DESC或某些反向范围条件,从而避免额外排序(filesort)。
1. 和正向扫描对比
| 类型 | 含义 | 典型场景 |
|---|---|---|
Index scan(正向) | 从索引小 → 大读 |
|
Backward index scan(反向) | 从索引大 → 小读 |
|
例如索引(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)+ 合适的复合索引,而不是只有单列索引却全表扫。
