目录
一:背景介绍
二:思路&方案
三:过程
验证数据类型转换的sql语句查看索引是否生效
1.表中的索引
2.表中字段的数据类型
3.执行sql语句
验证数据类型没有转换的sql语句查看索引是否生效
1.将sql语句中的值改为字符类型
四:总结
索引失效的6种情况
1.在索引类上做操作,比如类型转换,函数
2.通配符开头
3.WHERE 子句中的 OR
4.组合索引,不符合最左匹配原则
五:升华
在开发的过程中在编写查询语句的时候经常会用到is_delete=0的语句条件,但是我们在设计表的时候会把is_delete字段的类型设置为varchar。这就导致我们在执行有is_delete=0的sql语句的时候索引会失效。因为sql有一个优化器他会把数值类型的0转换成字符类型的0。数据类型转换会导致索引的失效。

1.mysql三大数据类型,分为数值类型、时间日期类型和字符类型。
2.验证数据类型转换的sql语句查看索引是否生效
3.验证数据类型没有转换的sql语句查看索引是否生效
![]()


type中的ALL代表全表查询,用结果上来看我们添加的索引是没有生效的。因为我们在执行sql语句的时候is_delete赋的值是数值类型,但是数据库中是字符类型。所以进行了类型的转换。导致索引是没有生效的。

type中从ALL转换成了ref。索引生效了

如果where 子句里 or前的列是索引列,or后面的条件列不是索引列,索引就会失效。
假设我们对字段 a,b 建立了一个组合索引(a,b)。
如果我们的查询是以下几种,则会正常走联合索引:
where a = 1;
where a = 2 and b = 2;
如果是如下几种则不会走组合索引:
where b = 2;
where b = 2 and a = 3;
通过对比我们可以看出,索引的生效是遵循最左匹配原则的。在使用的时候,必须从最左侧的索引开始。
只有我们明确了什么情况下索引会失效,我们再添加索引和使用索引的时候才会生效。才不会导致我们添加了索引占用了资源还没有生效的情况。明确概念明确边界。