什么是INDEX SKIP SCAN

本文详细解析了SQL查询过程中遇到的INDEXSKIPSCAN现象,特别是当查询条件只涉及复合索引中部分列时的情况。通过实例展示,解释了为何某些列在查询时会被看似“忽略”,实际上是通过逻辑拆分实现高效查询的过程。

在查看SQL的执行计划的时候,有时候会看到INDEX SKIP SCAN,其实这个索引扫描路径会发生在多个列建立的复合索引上,如果SQL中谓词条件只包含索引中的部分列,并且这些列不是建立索引时的第一列时,就可 能发生INDEX SKIP SCAN。这里SKIP的意思是因为查询条件没有第一列或前面几列,被忽略了。

引用Oracle文档的例子,比如如下的表:

employees (sex, employee_id, address)

建立如下索引:

(sex, employee_id)

如果索引包含如下的数据:

('F',98)
('F',100)
('F',102)
('F',104)
('M',101)
('M',103)
('M',105)

索引结构图示如下:
null

这时如果我们执行以下查询就会触发走INDEX SKIP SCAN:

SELECT *
   FROM employees
WHERE employee_id = 101;


这里sex就会被忽略掉了,实际上Oracle并没有真正忽略,而是在逻辑上拆分为2个子索引来查询而已。
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、付费专栏及课程。

余额充值