MYSQL索引跳跃扫描
索引跳跃扫描(Index Skip Scan) 是一种优化查询的技术,尤其在联合索引中用于减少扫描的无效行数。它通过"跳跃"式的扫描方式,避免了对索引中无用部分的扫描,从而提升查询效率。这种技术适合特定场景,并有一定的优缺点。
一、索引跳跃扫描的原理
索引跳跃扫描利用的是联合索引中非首列(非最左前缀)的索引列,来提高查询效率。例如,如果你有一个复合索引 (A, B),在传统的 B-Tree 索引中,只有当查询条件包含 A 列时,索引才会生效。但在跳跃扫描中,即使 A 没有出现在查询条件中,仍然可以通过扫描 B 列来有效查询。
跳跃扫描会逐步扫描 A 列的每一个可能值,然后在每个 A 值下查找 B 列中符合条件的记录。这样避免了扫描大量无关记录,提升了查询性能。
二、优点和缺点
优点:
提高查询效率:对于联合索引,如果查询条件只涉及非最左前缀列,跳跃扫描能够提高查询效率,减少全表扫描的次数。
减少 I/O 操作:通过避免扫描无效的索引行,跳跃扫描减少了对数据页的访问,从而节省了 I/O 操作。
降低索引空间要求:在某些场景下,可以减少为查询额外建立索引的需求,因为即使只使用了非首列,跳跃扫描也能利用现有的复合索引。
缺点:
不适合高基数列:跳跃扫描对低基数列(值不多但重复率高的列)有较好的效果。但如果参与跳跃扫描的列基数高,可能需要大量跳跃,反而影响效率。
无法替代覆盖索引:对于那些经常查询的列,跳跃扫描并不能代替为每个列创建单独的索引。对于常用列,覆盖索引的效果会更好。
不适用于所有查询类型:跳跃扫描仅在某些查询模式下有效,特别是当查询条件中不包含索引的最左前缀列时。如果最左列经常被查询,跳跃扫描无法发挥作用。
三、适用场景
索引跳跃扫描通常适用于以下场景:
联合索引查询:当查询条件不包括索引的最左前缀列,而仅包括后面的列时,可以使用跳跃扫描。
低基数列查询:对于列值种类少、重复率高的列,跳跃扫描可以减少扫描无效记录的时间。
避免额外索引:当现有的联合索引足够支持查询,而不想为特定列额外创建索引时,跳跃扫描是一种权衡。
原文链接:https://blog.csdn.net/qq_41520636/article/details/143042118




