Mysql在什么情况下索引失效,如何避免索引失效

1、环境准备

mysql的版本

mysql 联合索引作为唯一索引 mysql联合索引失效原理_索引


2、数据库表

mysql 联合索引作为唯一索引 mysql联合索引失效原理_mysql 联合索引作为唯一索引_02

下面来看各种情况:

为字段name,status,address建立复合索引

mysql 联合索引作为唯一索引 mysql联合索引失效原理_联合索引_03

1、最左匹配法则:
如果索引了多列,要遵守这个法则。指的是查询从索引的最左前列开始,并且不能跳过中间的列。

1.1、全值匹配,联合索引生效

mysql 联合索引作为唯一索引 mysql联合索引失效原理_mysql 联合索引作为唯一索引_04


1.2、使用name字段,索引也生效,只是索引的长度发生了变化,使用了联合索引中的name字段

mysql 联合索引作为唯一索引 mysql联合索引失效原理_mysql 联合索引作为唯一索引_05


1.3、使用name字段和status字段,索引生效,使用了联合索引中的name和status字段。

mysql 联合索引作为唯一索引 mysql联合索引失效原理_索引_06


1.4、使用status和address字段,索引失效。不走索引,因为跳过了最左列的name。

mysql 联合索引作为唯一索引 mysql联合索引失效原理_联合索引_07


1.5、下面这种情况也是走索引的,有很多人认为这种情况是不走索引,其实是错误的,一开始我们介绍了联合索引的概念,和where条件后顺序是没有关系的,只是看它包不包含这一列,包含了并且无跳过就会走索引。

mysql 联合索引作为唯一索引 mysql联合索引失效原理_联合索引_08


1.6、使用name字段和address字段,索引还是生效的,只是走的是name字段的索引,后面address字段不走索引。

mysql 联合索引作为唯一索引 mysql联合索引失效原理_字段_09


1.7、范围查询右边的列,不能走索引。在status字段使用范围查询,该列后面的字段索引失效。

mysql 联合索引作为唯一索引 mysql联合索引失效原理_mysql 联合索引作为唯一索引_10


1.8、不要在索引列上进行运算操作,索引会失效。

mysql 联合索引作为唯一索引 mysql联合索引失效原理_mysql_11


1.9、隐式转换,字符串类型不加单引号,会造成索引失效。

mysql 联合索引作为唯一索引 mysql联合索引失效原理_字段_12

1.10、尽量使用覆盖索引,表避免使用select * ,虽然下面这种情况是使用了索引,但是进行了回表查询,在Extra字段中描述了该信息,Using index condition

mysql 联合索引作为唯一索引 mysql联合索引失效原理_mysql_13


如果我们使用查询的全部是索引列,执行计划就会发生改变

mysql 联合索引作为唯一索引 mysql联合索引失效原理_mysql 联合索引作为唯一索引_14


1.11、使用or分割开的条件,如果or前的条件中的列有索引而后面的列没有索引,那么涉及的索引的列都不会被用到。name字段有索引,nicename字段没有索引,name字段的索引也是失效。

mysql 联合索引作为唯一索引 mysql联合索引失效原理_mysql_15


为了解决or索引失效,解决的办法是:使用union。1.12、以%开头的like模糊匹配索引会失效。

mysql 联合索引作为唯一索引 mysql联合索引失效原理_mysql_16


我们发现,以%在左侧的索引会失效,但是在%在右侧的不会失效。

我们可以使用覆盖索引来解决%在左侧的like索引失效问题

mysql 联合索引作为唯一索引 mysql联合索引失效原理_mysql_17


1.13、is null和 is not null 有时索引失效问题

mysql 联合索引作为唯一索引 mysql联合索引失效原理_mysql 联合索引作为唯一索引_18


is null和 is not null 索引失效和生效问题,根据数据库中的条数来决定。若是null 的条数远多(区分度很明显)is null 是会走索引的,is not null 一样,取决去mysql的底层自行决定是走索引还是全表扫描。

1.14、in 和not in

mysql 联合索引作为唯一索引 mysql联合索引失效原理_字段_19


证明in走索引,not in 不走索引。