快捷搜索:  汽车  科技

mysql强制索引有什么问题吗?MySQL中索引失效案例详解上

mysql强制索引有什么问题吗?MySQL中索引失效案例详解上延伸问题:mysql>explain select * from user where name=888;结果:没有加引号执行结果可以看到,没有使用到索引,且全表扫描执行。mysql>select * from user where name="888";结果:我们看到语句正确执行,且检索到结果mysql>select * from user where name=888;结果:我们看到语句正确执行,且检索到结果,和加引号执行检索的结果一样。mysql>explain select * from user where name="888";结果:加引号执行结果可以看到,使用到了索引

mysql中使用!=号导致索引失效全表扫描案例分析:
  1. 使用"="进行查看执行结果分析

mysql>explain select * from user where name="rose";

mysql强制索引有什么问题吗?MySQL中索引失效案例详解上(1)

结果:查询过程中使用到了索引

  1. 使用"!="进行查看执行结果分析

msyql>explain select * from user where name!="rose";

mysql强制索引有什么问题吗?MySQL中索引失效案例详解上(2)

结果:我们根据执行结果查看type=All,由此得知使用!=导致索引失效,进行了全表扫描

mysql中使用is not null导致索引失效案例分析:
  1. 使用is not null 查看执行分析,首先在实际生产环境中我们不会使用is null去检索一个结果的,这里只仅仅作为一个对比

mysql>explain select * from user where name is not null ;

mysql强制索引有什么问题吗?MySQL中索引失效案例详解上(3)

结果:没有用到索引,实际上是全表扫描

mysql中使用字符串不加索引导致索引失效案例分析:
  1. 查看表结构,name是varchar类型

mysql强制索引有什么问题吗?MySQL中索引失效案例详解上(4)

结果:我们看到name字段的表结构是varchar字符串类型

  1. 标准查询字符串加引号

mysql>select * from user where name="888";

mysql强制索引有什么问题吗?MySQL中索引失效案例详解上(5)

结果:我们看到语句正确执行,且检索到结果

  1. 字符串不加引号查询

mysql>select * from user where name=888;

mysql强制索引有什么问题吗?MySQL中索引失效案例详解上(6)

结果:我们看到语句正确执行,且检索到结果,和加引号执行检索的结果一样。

  1. 标准查询字符串加引号执行结果分析

mysql>explain select * from user where name="888";

mysql强制索引有什么问题吗?MySQL中索引失效案例详解上(7)

结果:加引号执行结果可以看到,使用到了索引

  1. 字符串不加引号查询执行结果分析

mysql>explain select * from user where name=888;

mysql强制索引有什么问题吗?MySQL中索引失效案例详解上(8)

结果:没有加引号执行结果可以看到,没有使用到索引,且全表扫描执行。

延伸问题:

1、为什么加引号和不加引号都能检索出正确的结果呢?

解释:因为只执行改条sql语句的时候,在mysql底层执行过程中,发现传来的是一个整型,而该字段是字符串varchar类型,此时在数据库底层就自动执行了一次转换,所以能查出结果。

2、那为什么不加引号检索出来之后所以会失效呢?

解释:mysql底层自动将整型转换成varchar类型,为了能检索到结果,我们都知道,name字段是索引列,这种mysql底层的自动转换会导致索引失效。我前几期的文章中有专门介绍在索引列进行计算、函数、转换导致索引失效的案例,可以去查看案例分析。

点击关注发私信或评论交流文章中有问题的地方,相互学习和答疑

猜您喜欢: