索引失效问题整理
Posted luffy5459
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了索引失效问题整理相关的知识,希望对你有一定的参考价值。
在面试的时候,数据库方面的问题对于开发人员来说,是绕不过的一个点,而数据库方面,很少直接面试SQL怎么写,而是问效率相关的问题,索引是提高查询效率的一种手段,但是往往,我们容易忽略的一个问题就是索引失效。
我以前面试,人家问我索引失效,我没反应过来,心想我创建了索引,查询就完事了,怎么会失效呢?后来才知道,索引创建成功,如果查询的时候,选择的字段或者查询的条件设置不合理,虽然能够出结果,但是索引是失效的,这就是索引失效的情形。
下面来总结一下,索引失效的情况,有点小复杂。
- 对于联合索引,违背索引最左前缀原则。
- 对索引列使用函数。
- 对索引列作运算操作(条件右边使用运算符,索引会生效)。
- 使用like关键字,并以'%'开始(使用'%'结尾索引是生效的)。
- 使用不等于操作符<>。
- 使用not null。
- 使用or,or两边的列索引名称不一样,而且一个有索引,另一个没有索引。(or两边的列相同或者都有索引会生效)。
- 索引列存在类型转换。
从运行sql角度来验证这些失效的情况。首先,我们要准备表,其次,建立对应的索引,最后查询的时候,使用explain执行计划,查看运行结果。
联合索引,左列前缀
从截图可以看出,对emp表创建联合索引(name,age,salary)
1)、当使用全部索引时,用到了索引;
2)、当不使用最左列name时,索引失效。
3)、当使用了最左列name,中间列age缺失,索引还是生效的。
索引列使用函数
索引使用数据库自带的函数,当函数在左边,索引失效,当函数在右边,索引生效。
索引列计算
如果对索引列进行计算,索引会失效。
like关键字
使用like关键字,如果'%'在左边,比如'%a',那么索引会失效。如果'%'在右边,比如'a%',那么索引会生效。
不等于<>
对于普通的索引,<>,!=都不会生效。
有生效的情况。
使用not null
使用null生效,使用not null不生效
or关键字
使用or关键字,不是说一定会失效,就是说or两边的列要么一样,要么两个都建立了索引。
类型转换
如果列是字符串类型,这个时候,直接传入数字,虽然不会报错,而且也能查询出结果,但是通过类型转换的,索引会失效。
索引失效,大致分为两类,违背最佳左前缀法则,联合索引和like关键字,使用左列和'a%'匹配其实索引都是可以生效的。另一类是进行字段计算类,这一类改变了列的值,再通过改变的值去索引,当然不可能与原始值的索引匹配,所以失效。
以上是关于索引失效问题整理的主要内容,如果未能解决你的问题,请参考以下文章