1、最佳左前缀原则——如果索引了多列,要遵守最左前缀原则。指的是查询要从索引的最左前列开始并且不跳过索引中的列。
前提条件:表中已添加复合索引(username,password,age)
![](/d/20211017/4a12d3e1c91cccc8fd46fe12252f0ae8.gif)
分析:该查询缺少username,查询条件复合索引最左侧username缺少,违反了最佳左前缀原则,导致索引失效,变为ALL,全表扫描
![](/d/20211017/001936a3519bebd1708b9c03d7402609.gif)
分析:查询条件缺少username,password,查询条件复合索引最左侧username,password缺少,违反了最佳左前缀原则,导致索引失效,变为ALL,全表扫描
![](/d/20211017/531c53e06543e99fa63ebfdd273b5c92.gif)
分析:该查询只有一个username条件,根据最佳左前缀原则索引能够被使用到,但是是部分使用
2、不在索引列上做任何操作(计算,函数,(自动或者手动)类型装换),会导致索引失效而导致全表扫描
![](/d/20211017/744e6ee7cf7864bee8020cfe00feca3e.gif)
![](/d/20211017/f241c4b0e78e2ba721103f34b57ba684.gif)
分析:第一个图索引列不使用函数,遵循左前缀原则,能够使用索引。第二张图索引列上使用了函数,即使遵循左前缀原则,索引还是失效
3、存储引擎不能使用索引中范围条件右边的列,范围之后索引失效。( ,> between and)
![](/d/20211017/95591aa2b444d15e056d2642c7b4d778.gif)
![](/d/20211017/535bfd8ff9f117bfe9f2642b378f60d4.gif)
分析:图一索引全部使用到。图二索引使用到username和age,但是username是使用索引检索,而age着重索引排序,这时age为范围查找,password索引将失效
4、mysql使用不等于(!= 或者>)的时候,无法使用索引,会导致索引失效
![](/d/20211017/59c6022932840c84ce5bbb3183650bfa.gif)
![](/d/20211017/6f95ff4564aeef33e925b26e33feb793.gif)
5、mysql中使用is not null 或者 is null会导致无法使用索引
![](/d/20211017/6f23a3b31e1cce0ef45d3f59f7087352.gif)
分析:对username列做了普通索引,查询带is not null,结果索引不生效
6、mysql中like查询是以%开头,索引会失效变成全表扫描,覆盖索引。
![](/d/20211017/2d86a6bd5bff54babd4aef5b1e3b8684.gif)
分析:对username列做了普通索引,以%开头进行查询,结果索引失效被覆盖
7、mysql中,字符串不加单引号索引会失效。正确写法:select * from t_user where username = 'lujin';
8、mysql中,如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)。要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
![](/d/20211017/809ceb1d626967d0ae6f385dac05cfc4.gif)
9、如果mysql使用全表扫描要比使用索引快,则不会使用到索引
总结
到此这篇关于mysql索引失效情况分析的文章就介绍到这了,更多相关mysql索引失效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:- mysql回表致索引失效案例讲解
- 解决mysql模糊查询索引失效问题的几种方法
- MySQL索引失效的典型案例
- MySQL索引失效的几种情况详析
- MySQL索引失效的几种情况汇总
- mysql索引失效的五种情况分析
- Mysql索引会失效的几种情况分析
- mysql索引失效的十大问题小结