为什么会有索引失效的情况?
为什么会有索引失效的情况?
提示
题眼: MySQL会评估索引的性能,进而选择要不要走索引
索引失效的情况:
- 不符合最左前缀原则
- 条件中有or(若想让索引生效,只能将or条件中的每个列都加上索引),like查询以%开头、!=操作符, null值查询
- 字符串索引,在使用时,数据一定要使用引号引用起来。若是int类型的索引,数据使不使用引号都可以。使用函数、计算操作也会导致索引失效(隐式转换)
- 当mysql估计使用去全表扫描比使用索引快时,如表中数据量较少时
重要
参考答案:
假设我们已经在一张表上建好了索引,但是我们的SQL语句没有用到这条索引,常见的情况主要有两种,第一种就是SQL语句本身存在一些问题,比如不符合最左前缀原则,我们的索引是 abc,但是SQL语句只用了bc,这样子是不会走索引的。还有就是,使用了OR,I= 或者Null查询,或者使用了like以%号开头,(固定开头会走索引)这些关键字也会导致不走索引。另外还有涉及到隐式转换也不会用索引,比如一个字段是string类型,SQL语句把他当成了int,那么它肯定不走索引,最后的话,对某一列使用函数也不会走索引。
如果我们的SQL没啥问题,但是依然扫的全表,那么这种情况就比较难办。通常情况下,MySQL会抽样统计一下数据值,来决定用不用索引。如果表里的数据量很少,那确实没必要走索引,用了索引还得回表,得不偿失。这种情况可以不用考虑。
但是如果数据量特别大,SQL语句又比较复杂,那么MySQL也不太会用索引,这种情况下,可以用force命令,强制使用某个索引。
