首页/数据/SQL 速查/跳跃扫描 skip scan(8.0.13+)
性能与执行计划72 条

跳跃扫描 skip scan(8.0.13+)

未使用联合索引前导列时,优化器可对前导列的少量取值逐个“跳跃”扫描:Extra 显示 Using index for skip scan。

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

跳跃扫描是什么

跳跃扫描是 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;

触发与限制

条件影响说明
前导列基数低有利取值少,跳跃次数可控
后续列为等值条件有利可以精确定位
后续列为范围条件不利适用性下降
前导列基数高不利跳跃次数太多,优化器放弃
统计信息准确性关键估算偏差会让启用与否变得不可预测
不要把跳跃扫描当稳定能力:前导列基数变化、统计信息更新、查询条件形态不同,都可能让它不再触发,关键查询仍应验证实际计划。
高频查询不要指望跳跃扫描替代索引:它本身有额外开销,专用复合索引在稳定性和性能上都更可靠。

易错点

  • 把跳跃扫描当稳定能力:基数变化或条件形态不同可能不再触发,关键查询按实际计划评估
  • 因为有跳跃扫描就放弃合理索引:高频查询仍建议按列顺序设计专用索引
  • 忽略统计信息的影响:估算偏差会让是否启用变得不可预测,需保持统计更新
  • 在有范围条件的查询上期待跳跃扫描:后续列是范围条件时适用性明显下降
  • 把 Extra 提示当成一定走索引:还要看实际读取行数与耗时,必要时对比新建索引方案

数据来源与参考

  • MySQL 8.0 Reference Manual · Skip Scan Range Access Method
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌