MySQL索引失效
2022-10-13 22:2:57 Author: www.yanglong.pro(查看原文) 阅读量:6 收藏

  1. 联合索引不符合最左匹配原则、
  2. 使用了select *
    可能导致不走“覆盖索引”
  3. 索引列参与了运算
  4. 索引列使用了函数
  5. 错误的使用like
  6. 隐式类选转换(数字转字符串,或者字符串转类选)
  7. 使用了OR操作
  8. 两列做比较
  9. 不等于比较
  10. is not null
    (is nul 会走)
  11. not in 和 not exists
  12. 使用order by导致索引失效
    所以,在基于order by和limit进行使用时,要特别留意。是否走索引不仅涉及到数据库版本,还要看Mysql优化器是如何处理的。
    order by id 会走索引
  13. 参数不同导致索引失效
    (可能DBMS发现全表扫描比走索引效率更高,因此就放弃了走索引)
  14. 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 =一个值),以上两种情况索引都会走。其他情况不会走。


文章来源: https://www.yanglong.pro/mysql%e7%b4%a2%e5%bc%95%e5%a4%b1%e6%95%88/
如有侵权请联系:admin#unsafe.sh