在面试的时候,数据库方面的问题对于开发人员来说,是绕不过的一个点,而数据库方面,很少直接面试SQL怎么写,而是问效率相关的问题,索引是提高查询效率的一种手段,但是往往,我们容易忽略的一个问题就是索引失效。
我以前面试,人家问我索引失效,我没反应过来,心想我创建了索引,查询就完事了,怎么会失效呢?后来才知道,索引创建成功,如果查询的时候,选择的字段或者查询的条件设置不合理,虽然能够出结果,但是索引是失效的,这就是索引失效的情形。
下面来总结一下,索引失效的情况,有点小复杂。
- 对于联合索引,违背索引最左前缀原则。
- 对索引列使用函数。
- 对索引列作运算操作(条件右边使用运算符,索引会生效)。
- 使用like关键字,并以'%'开始(使用'%'结尾索引是生效的)。
- 使用不等于操作符<>。
- 使用not null。
- 使用or,or两边的列索引名称不一样,而且一个有索引,另一个没有索引。(or两边的列相同或者都有索引会生效)。
- 索引列存在类型转换。
从运行sql角度来验证这些失效的情况。首先,我们要准备表,其次,建立对应的索引,最后查询的时候,使用explain执行计划,查看运行结果。
联合索引,左列前缀
从截图可以看出,对emp表创建联合索引(name,age,salary)
1)、当使用全部索引时,用到了索引;
2)、当不使用最左列name时,索引失效。
&n