为什么范围后索引会失效 存储引擎不能使用索引中范围条件右边的列

简介: 比如说有三个字段 a b c,建立复合索引a_b_c。此时叶子节点的数据排序后可能为

比如说有三个字段 a b c,建立复合索引a_b_c。此时叶子节点的数据排序后可能为


(a=1 b=1 c=1) (a=1 b=2 c=1) (a=1 b=2 c=3)

(a=2 b=2 c=3) (a=2 b=2 c=5) (a=2 b=5 c=1) (a=2 b=5 c=2)

(a=3 b=0 c=1) (a=3 b=3 c=5) (a=3 b=8 c=6)


查找


select a,b,c from table where a = 2 and b = 5 and c = 2


先根据a = 2找到第二行的四条数据


(a=2 b=2 c=3) (a=2 b=2 c=5) (a=2 b=5 c=1) (a=2 b=5 c=2)


然后根据b=5查到两条


(a=2 b=5 c=1) (a=2 b=5 c=2)


最后根据c=2查到目标数据


(a=2 b=5 c=2)


现在使用了范围条件


select a,b,c from table where a = 2 and b >1 and c = 2


先根据a = 2找到第二行的四条数据


(a=2 b=2 c=3) (a=2 b=2 c=5) (a=2 b=5 c=1) (a=2 b=5 c=2)


然后根据b>1查到四条数据


(a=2 b=2 c=3) (a=2 b=2 c=5) (a=2 b=5 c=1) (a=2 b=5 c=2)


此时要查找c=2了,但发现四条数据的c分别是3,5,1,2无序!所以索引失效!


总结

因为前一个条件相同的情况下 当前条件才会是有序的。当前一个条件不同 那么无法保证当前条件为有序的 所以索引失效


再进一步,假设有以下数据


1(b=2,c=4)

2(b=2,c=5)

3(b=3,c=1)

4(b=3,c=2)


此时对于b 这四个数据都是有序的。

但对于c 只有(1,2)和(3,4)两组数据内部分别有序,如果想让他有序 则需要进行再一次的排序。但是排序的时间复杂度高于遍历数据的时间复杂度 ps:再慢也不会慢过o(n),所以会直接遍历所有数据索引失效。


至于为什么在c后面的索引也会失效(范围后全失效),难道不能查完c之后,把c的结果当成索引继续吗?

再举一组例子

假设有以下数据


1(b=1,c=4,d = 10)

2(b=2,c=5,d = 6)

3(b=2,c=5,d = 7)

4(b=3,c=1,d = 2)

5(b=3,c=5,d = 1)


查找 b>1且 c = 5,d=6,先查出

b>1:


2(b=2,c=5,d = 6)

3(b=2,c=5,d = 7)

4(b=3,c=1,d = 2)

5(b=3,c=5,d = 1)


此时索引失效了。遍历一次结果(假设只对比c的值,这样更快)找到三条数据

c = 5:

2(b=2,c=5,d = 6)

3(b=2,c=5,d = 7)

5(b=3,c=5,d = 1)


这时候发现要查找字段d还是乱的,继续o(n)。

综上所述,范围后的查询字段都不是有序的,所以索引都失效了。

目录
相关文章
|
7月前
|
索引
15. 索引是越多越好嘛? 什么样的字段需要建索引, 什么样的字段不需要 ?
是否越多索引越好?并非如此。应根据需求建索引:主键自动索引,频繁查询、关联查询、排序、查找及统计分组字段建议建索引。但表记录少,频繁增删改操作,频繁更新的字段,以及使用频率不高的查询条件则不需要建索引。
121 0
|
6月前
|
SQL 关系型数据库 MySQL
MySQL数据库——索引(6)-索引使用(覆盖索引与回表查询,前缀索引,单列索引与联合索引 )、索引设计原则、索引总结
MySQL数据库——索引(6)-索引使用(覆盖索引与回表查询,前缀索引,单列索引与联合索引 )、索引设计原则、索引总结
112 1
|
7月前
|
SQL 存储 关系型数据库
MySQL索引原理(索引、约束、索引实现、索引失效、索引原则)以及SQL优化
MySQL索引原理(索引、约束、索引实现、索引失效、索引原则)以及SQL优化
180 1
|
SQL Java 关系型数据库
索引操作
索引操作
61 0
|
索引
索引是越多越好嘛? 什么样的字段需要建索引, 什么样的字段不需要 ?
索引是越多越好嘛? 什么样的字段需要建索引, 什么样的字段不需要 ?
132 0
|
数据库 索引
索引是越多越好嘛? 什么样的字段需要建索引
索引的作用是加快数据库的查询速度,但并不是索引越多越好。过多的索引会增加数据库的存储空间和维护成本,并且在写操作时可能会降低性能。
230 0
|
存储 SQL 关系型数据库
【名词解释与区分】聚集索引、非聚集索引、主键索引、唯一索引、普通索引、前缀索引、单列索引、组合索引、全文索引、覆盖索引
【名词解释与区分】聚集索引、非聚集索引、主键索引、唯一索引、普通索引、前缀索引、单列索引、组合索引、全文索引、覆盖索引
448 1
【名词解释与区分】聚集索引、非聚集索引、主键索引、唯一索引、普通索引、前缀索引、单列索引、组合索引、全文索引、覆盖索引
|
SQL 关系型数据库 MySQL
表索引——隐藏索引和删除索引
前言 MySQL 8开始支持隐藏索引。隐藏索引提供了更人性化的数据库操作。
|
存储 关系型数据库 MySQL
MySQL中什么是什么是主键索引、联合索引、覆盖索引、索引条件下推及区别
主键索引:它是一种特殊的唯一索引,不允许有空值,一般在建表的时候指定主键,就会创建主键索引,CREATE INDEX不能用来创建主键索引,通常使用ALTER TABLE来代替。
175 0
|
存储 算法 搜索推荐
②MySQL的索引(普通索引、唯一索引,主键索引、组合索引、全文索引、空间索引)相关操作
MySQL的索引(普通索引、唯一索引,主键索引、组合索引、全文索引、空间索引)相关操作
274 0
②MySQL的索引(普通索引、唯一索引,主键索引、组合索引、全文索引、空间索引)相关操作