Index Skip Scan 介绍

本文介绍了Index Skip Scan技术,当数据有序存储且唯一值很少时,可用于加快扫描,如求distinct值、未指定主键前缀或索引前缀的扫描等场景。实现该技术需在计划生成阶段探测NDV,存储层收集前缀distinct值并基于range扫描。

基础概念

对一组数据查找唯一值(distinct),数据满足下面条件时,可以使用 Index Skip Scan 技术来加快扫描。

  1. 数据有序存储;
  2. 数据的唯一值很少

例如下面的语句中,c1 唯一值很少,我们想求 c1 的唯一值集合,最简单的方式就是全表扫描一遍,然后利用 hashset 来计算出唯一值集合。但是这种方式太过暴力,如果c1列唯一值少,可以通过二分查找的方式逐个查找最小的 c1,从而跳过2个唯一值之间大量的行。

create table t1(c1 int, c2 int, c3 int, primary key(c1,c2));
Index Range ScanIndex Skip Scan数据库索引扫描的两种不同方式,它们存在多方面的区别: ### 扫描原理 - **Index Range Scan**:是在索引中按照指定的范围进行扫描。例如,在一个按时间排序的索引中,查询某个时间段内的数据,就可以使用 Index Range Scan 从索引中找到起始时间和结束时间对应的位置,然后在这个范围内依次扫描索引记录。它是基于索引的有序性,沿着索引的顺序查找符合范围条件的数据。 - **Index Skip Scan**:利用索引具备数据有序存储的特征,采用二分的方式跳着查找,目的是扫描出需要的所有数据。当索引的前导列没有指定具体值,而后续列有条件限制时,数据库可以跳过前导列的不同值,直接在后续列上查找符合条件的数据 [^1]。 ### 适用场景 - **Index Range Scan**:适用于明确指定了索引列范围的查询。比如,查询年龄在 20 到 30 岁之间的用户信息,使用 Index Range Scan 可以高效地在年龄索引上定位到相应的数据范围。 - **Index Skip Scan**:适用于复合索引中,前导列没有条件限制,但后续列有条件的情况。例如,有一个复合索引 (col1, col2),当查询语句中没有对 col1 进行限制,而对 col2 有条件时,就可能使用 Index Skip Scan。 ### 性能特点 - **Index Range Scan**:在范围较小时,性能通常较好,因为只需要扫描指定范围内的索引记录。但如果范围过大,扫描的记录数增多,性能可能会下降。 - **Index Skip Scan**:当复合索引的前导列有较多不同值时,可能需要多次跳跃查找,会增加一定的开销。但在合适的场景下,它可以避免全索引扫描,提高查询效率。 ### 示例代码 假设存在一个数据库表 `employees`,有 `department` 和 `salary` 两列,并且创建了复合索引 `(department, salary)`。 #### Index Range Scan ```sql -- 查询工资在 5000 到 10000 之间的员工 SELECT * FROM employees WHERE salary BETWEEN 5000 AND 10000; ``` 这个查询可能会使用 Index Range Scan 在 `salary` 列上进行范围扫描。 #### Index Skip Scan ```sql -- 查询所有部门中工资大于 8000 的员工 SELECT * FROM employees WHERE salary > 8000; ``` 由于没有对 `department` 列进行限制,数据库可能会使用 Index Skip Scan 跳过 `department` 列的不同值,直接在 `salary` 列上查找符合条件的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值