介绍
小编给大家分享一下mysql索引失效的原因,希望大家阅读完这篇文章后大所收获、下面让我们一起去探讨吧!
索引对于mysql而言,是非常重要的篇章。索引知识点也巨多,要想掌握透彻,需要逐个知识点一一击破,今天来先来聊聊哪些情况下会导致索引失效。
图片总结版
引用>
<强>相关免费学习推荐:强> <强> mysql视频教程强>
引用>全值匹配(索引最佳)
explain select *,得到user where name =, & # 39; zhangsan& # 39;,以及age =, 20,以及pos =, & # 39; cxy& # 39;,以及phone =, & # 39; 18730658760 & # 39;;
和索引顺序无关,mysql底层的优化器会进行优化,调整索引的顺序 explain select *,得到user where name =, & # 39; zhangsan& # 39;,以及age =, 20,以及pos =, & # 39; cxy& # 39;,以及phone =, & # 39; 18730658760 & # 39;;
1,违反最左前缀法则
如果索引有多列,要遵守最左前缀法则 即查询从索引的最左前列开始并且不跳过索引中的列 explain select *,得到user where age =, 20,以及phone =, & # 39; 18730658760 & # 39;,以及pos =, & # 39; cxy& # 39;;
2,在索引列上做任何操作
如计算,函数,(自动或手动)类型转换等操作,会导致索引失效从而全表扫描 explain select *,得到user where 左(名称、5),=,& # 39;zhangsan& # 39;,以及age =, 20,以及phone =, & # 39; 18730658760 & # 39;;
3,索引范围条件右边的列
索引范围条件右边的索引列会失效 explain select *,得到user where name =, & # 39; zhangsan& # 39;,以及age 祝辞,20,以及pos =, & # 39; cxy& # 39;;
4,尽量使用覆盖索引
只访问索引查询(索引列和查询列一致),减少选择* explain select 姓名、年龄、pos phone 得到user where age =, 20;
5,使用不等于(!=& lt;祝辞)
mysql在使用不等于(!=& lt;祝辞)的时候无法使用索引会导致全表扫描(除覆盖索引外) explain select *,得到user where age !=, 20; explain select *,得到user where age & lt;祝辞,20;
6,像以通配符开头(& # 39;% abc # 39;)
索引失效 explain select *,得到user where name like & # 39; % zhangsan& # 39;;
索引生效 explain select *,得到user where name like & # 39; zhangsan % & # 39;;
7字符串不加单引号索引失效
explain select *,得到user where name =, 2000;
8,或连接
少用或 explain select *,得到user where name =, & # 39; 2000 & # 39;,趁机age =, 20,趁机pos =& # 39; cxy& # 39;;mysql索引失效的原因