1.原文准备链接:
索引失效的10种场景,你知道几个呢?(面试必刷!)_索引失效的场景-CSDN博客
2. 不满足最左匹配原则
之前我已经给code、age和name这3个字段建好联合索引
:idx_code_age_name。
该索引字段的顺序是:
code
age
name
如果在使用联合索引时,没注意最左前缀原则,很有可能导致索引失效
code字段,它是索引字段中的第一个字段,也就是最左边的字段。只要有这个字段在,该sql已经就能走索引。
这就是我们所说的最左匹配原则
。
详细:MySQL最左匹配原则,道儿上兄弟都得知道的原则-CSDN博客
3. 使用了select *
在该sql中用了select *
,从执行结果看,走了全表扫描,没有用到任何索引,查询效率是非常低的。
4. 索引列上有计算
如果id列上面有计算,比如:
explain select * from user where id+1=2;
5. 索引列用了函数
explain select * from user where SUBSTR(height,1,2)=17;
6. 字段类型不同
t_user表中的code字段,它是varchar
字符类型的。
但如果你在写sql时,不小心把引号弄掉了,把sql语句变成了:
explain select * from user where code=101;
7. like左边包含%
查询sql语句为:
explain select * from user where code like '%1';
8. 列对比
sql这样写:
explain select * from user where id=height
9. 使用or关键字
注意:如果使用了or
关键字,那么它前面和后面的字段都要加索引,不然所有的索引都会失效,这是一个大坑。
10. not in和not exists
11. order by的坑
如果order by语句中没有加where或limit关键字,该sql语句将不会走索引。