mysql中使用!=号导致索引失效全表扫描案例分析:
- 使用"="进行查看执行结果分析
mysql>explain select * from user where name="rose";
结果:查询过程中使用到了索引
- 使用"!="进行查看执行结果分析
msyql>explain select * from user where name!="rose";
结果:我们根据执行结果查看type=All,由此得知使用!=导致索引失效,进行了全表扫描
mysql中使用is not null导致索引失效案例分析:
- 使用is not null 查看执行分析,首先在实际生产环境中我们不会使用is null去检索一个结果的,这里只仅仅作为一个对比
mysql>explain select * from user where name is not null ;
结果:没有用到索引,实际上是全表扫描
mysql中使用字符串不加索引导致索引失效案例分析:
- 查看表结构,name是varchar类型
结果:我们看到name字段的表结构是varchar字符串类型
- 标准查询字符串加引号
mysql>select * from user where name="888";
结果:我们看到语句正确执行,且检索到结果
- 字符串不加引号查询
mysql>select * from user where name=888;
结果:我们看到语句正确执行,且检索到结果,和加引号执行检索的结果一样。
- 标准查询字符串加引号执行结果分析
mysql>explain select * from user where name="888";
结果:加引号执行结果可以看到,使用到了索引
- 字符串不加引号查询执行结果分析
mysql>explain select * from user where name=888;
结果:没有加引号执行结果可以看到,没有使用到索引,且全表扫描执行。
延伸问题:
1、为什么加引号和不加引号都能检索出正确的结果呢?
解释:因为只执行改条sql语句的时候,在mysql底层执行过程中,发现传来的是一个整型,而该字段是字符串varchar类型,此时在数据库底层就自动执行了一次转换,所以能查出结果。
2、那为什么不加引号检索出来之后所以会失效呢?
解释:mysql底层自动将整型转换成varchar类型,为了能检索到结果,我们都知道,name字段是索引列,这种mysql底层的自动转换会导致索引失效。我前几期的文章中有专门介绍在索引列进行计算、函数、转换导致索引失效的案例,可以去查看案例分析。