组合索引的 1:索引范围扫描 INDEX (RANGE SCAN) 2:索引跳跃式扫描INDEX(SKIP SCAN)
如下建立组合索引
当前oralce 版本
一:INDEX (RANGE SCAN)
组合索引情况下,where 条件包含索引的第一列字段查询时,正常会走INDEX (RANGE SCAN)查询,测试数量为24067206条数据时,explain查询语句依然进行了索引范围扫描(具体量达到多少极限值时,会走全表扫描,这个后续进行监测)
二:INDEX(SKIP SCAN)
组合索引情况下,where 条件不包含索引的第一列字段查询时,并且当数据比较少时会进行索引跳跃式扫描,依旧会走索引
度娘:为什么在where条件中没有对目标索引的前导列指定查询条件,但Oracle依然可以用上该索引呢?这是因为Oracle帮你对该索引的前导列的所有distinct值做了遍历。
Oracle中的索引跳跃式扫描仅仅适用于那些目标索引前导列的distinct值数量较少、后续非前导列的可选择性又非常好的情形
2.1:表中有618条测试数据时,where 不包含前导列字段,explain 查询语句可以看到执行语句进行了索引跳跃式扫描
2.2 当测试数据增加在999条时,再执行explain,发现开始进行了全表扫描
总结:没有前导列查询,不一定不走索引。但是索引跳跃式扫描的执行效率一定会随着目标索引前导列的distinct值数量的递增而递减,所以当表中数量大时,效率低下时,就进行了全表扫描
三:总结
1:数据库中建立了组合索引时,前导列的建立是要慎重考虑的,优先考虑必传值
2:组合索引查询时,最好一定要加上前导列的查询字段,否则量大时,一定会全表扫描,查询速度慢,会导致业务调用超时,影响比较大