跳跃扫描是什么
跳跃扫描是 MySQL 8.0.13 引入的访问方式:查询条件里没有联合索引的前导列时,优化器可以对前导列的少量取值逐个「跳跃」扫描,间接利用后面那一列。EXPLAIN 的 Extra 会显示 Using index for skip scan,好处是低频查询不必再加一条索引。
基本信息
| 版本 | MySQL 8.0.13 起 |
|---|---|
| 触发条件 | 前导列取值少(低基数),后续列为等值条件 |
| 削弱因素 | 后续列带范围条件时适用性下降 |
| 收益 | 避免为低频查询额外加索引 |
| 不确定性 | 是否启用由优化器决定,以 EXPLAIN 为准 |
典型使用场景
- 联合索引前导列基数低时救急
- 评估是否为低频查询加专门索引
- 排查「没写前导列却仍然很快」的原因
- 对比跳跃扫描与新建索引的效果
- 分析版本升级带来的计划变化
示例
示例
-- 联合索引前导列是 gender,查询里没有 gender 条件
ALTER TABLE users ADD INDEX idx_gender_city (gender, city);
EXPLAIN SELECT * FROM users WHERE city = 'beijing';
-- Extra 可能显示:Using index for skip scan
-- 对照:前导列基数高、或后续带范围条件时,通常不会启用
EXPLAIN SELECT * FROM users WHERE city = 'beijing' AND age > 20;触发与限制
| 条件 | 影响 | 说明 |
|---|---|---|
| 前导列基数低 | 有利 | 取值少,跳跃次数可控 |
| 后续列为等值条件 | 有利 | 可以精确定位 |
| 后续列为范围条件 | 不利 | 适用性下降 |
| 前导列基数高 | 不利 | 跳跃次数太多,优化器放弃 |
| 统计信息准确性 | 关键 | 估算偏差会让启用与否变得不可预测 |
不要把跳跃扫描当稳定能力:前导列基数变化、统计信息更新、查询条件形态不同,都可能让它不再触发,关键查询仍应验证实际计划。
高频查询不要指望跳跃扫描替代索引:它本身有额外开销,专用复合索引在稳定性和性能上都更可靠。