- 联合索引不符合最左匹配原则、
- 使用了select *
可能导致不走“覆盖索引” - 索引列参与了运算
- 索引列使用了函数
- 错误的使用like
- 隐式类选转换(数字转字符串,或者字符串转类选)
- 使用了OR操作
- 两列做比较
- 不等于比较
- is not null
(is nul 会走) - not in 和 not exists
- 使用order by导致索引失效
所以,在基于order by和limit进行使用时,要特别留意。是否走索引不仅涉及到数据库版本,还要看Mysql优化器是如何处理的。
order by id 会走索引 - 参数不同导致索引失效
(可能DBMS发现全表扫描比走索引效率更高,因此就放弃了走索引) - Mysql优化器的其他优化策略,比如优化器认为在某些情况下,全表扫描比走索引快,则它就会放弃索引。
explain select * from userinfo where username=’1′; — 走索引
explain select * from userinfo where username=1; — 不走索引
注意:字符串传数字不走索引,数字传字符串走索引(待确认)
explain select * from userinfo where username=’1′; — 走索引
explain select * from userinfo where username!=’1′; — 不走索引 (!)注意实际上MySQL8.0里可能走的是range类型的索引
is null会走索引,is not null不会走索引。
explain select * from userinfo where username is null;
explain select * from userinfo where username is not null;
使用in
会走索引,not in
则不会走索引。
表中有数据时,发现
not int
语句又走了索引,这下有点晕了吧(这个有可能是MySQL执行计划的Bug),到这里咱们先这样认为:in
会走索引,not int
不走索引!具体咱们最后一章再测试。
or
导致复合索引失效
诡异的or
语句
首先说明一下:or不会导致索引失效
到这里差不多要结束了,关于索引失效的问题。主要有这几点,要大家牢记!:
复合索引:
1)记住全值匹配
2)牢记最左前缀法则
3)尽量避免or带来的复合索引失效
单列索引:
1)不要在索引列上做任何操作
2)字符串索引必须加引号
3)不要使用!=或者<>
4)模糊查询时不要使用前通配符匹配
5)is not null不会走索引
6)not in会导致索引失效
————————————————
版权声明:本文为CSDN博主「緑水長流*z」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Bb15070047748/article/details/106495816
索引失效的一些情况
1) 没有查询条件,或者查询条件没有建立索引
2) 在查询条件上没有使用引导列
3) 查询的数量是大表的大部分,应该是30%以上。
4) 索引本身失效
5) 查询条件使用函数在索引列上,或者 对索引列进行运算, 运算包括(+,-,*,/,! 等) 错误的例子:select * from test where id-1=9; 正确的例子:select * from test where id=10;
6) 对小表查询
7) 提示不使用索引
8) 统计数据不真实
9) CBO计算走索引花费过大的情况。其实也包含了上面的情况,这里指的是表占有的block要比索引小。
10)隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效. 错误的例子:select * from test where tu_mdn=13333333333; 正确的例子:select * from test where tu_mdn=’13333333333′;
12) 1,<> 2,单独的>,<,(有时会用到,有时不会)
13,like “%_” 百分号在前.
14,单独引用复合索引里非第一位置的索引列.
15,字符型字段为数字时在where条件里不添加引号.
16,对索引列进行运算.需要建立函数索引.
17,not in ,not exist.
18,当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。
19,B-tree索引 is null不会走,is not null会走,位图索引 is null,is not null 都会走
20,联合索引 is not null 只要在建立的索引列(不分先后)都会走, in null时 必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时,其他建立索引的列可以是is null(但必须在所有列 都满足is null的时候),或者=一个值; 当建立索引的第一位置是=一个值时,其他索引列可以是任何情况(包括is null =一个值),以上两种情况索引都会走。其他情况不会走。