mysql 索引使用的总结

1、索引字段必须not null,null会使索引失效,因为索引的本质是将字段排序,分割范围后快速定位。 
2、尽量在辨识度高的字段上添加索引(类型字段不建议加索引,一个值超过总量的30% 索引就失效了)

    例:发送状态00-未发送 01-已发送,当我们的查询值关注于00的数据,并且00的数据总是只是少量(不超过30%)时,我们可以在发送状态上加上索引。
3、order by 字段也要加索引。优先级在where字段后面。例:where a=1  order by b 可以用联合索引 (a,b)
4、使用联合索引,确定值要在范围值前面使用。例 where a=1 and  b>0  and b<10


索引失效场景:
1.    如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 例(where a=1  or b=2,此时a有索引也会失效)  
  注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

       例:where(a=1 or b=1) a、b都有索引,则整个查询走索引,a有索引,b没有索引,则查询不会走索引

2.对于多列索引,不是使用的第一部分,则不会使用索引(例:联合索引a,b,c .执行where b=1 不会使用索引)

3.前导模糊查询不能利用索引(like '%XX'或者like '%XX%')

  假如有这样一列code的值为'AAA','AAB','BAA','BAB' ,如果where code like '%AB'条件,由于前面是

  模糊的,所以不能利用索引的顺序,必须一个个去找,看是否满足条件。这样会导致全索引扫描或者全表扫

  描。如果是这样的条件where code like 'A % ',就可以查找CODE中A开头的CODE的位置,当碰到B开头的

  数据时,就可以停止查找了,因为后面的数据一定不满足要求。这样就可以利用索引了。

'%3a'   以3a结尾   失效
'3a%'   以3a开头   生效


 EXPLAIN  select  *  from  t_s_cm_video_main  where apply_code like '%3a'  查看执行计划、优化SQL

mysql sql 中如果使用了 not in , not exists , (<> 不等于 !=) 这些不走
< 小于 > 大于 <= >= 这个根据实际查询数据来判断,如果全盘扫描速度比索引速度要快则不走索引 

!= 会走范围索引,效率取决于范围的大小。https://www.jianshu.com/p/6cb11442b1ab


11)对索引列进行运算导致索引失效,我所指的对索引列进行运算包括(+,-,*,/,! 等) 
错误的例子:select * from test where id-1=9; 
正确的例子:select * from test where id=10; 


12)使用mysql内部函数导致索引失效.对于这样情况应当创建基于函数的索引. 
错误的例子:select * from test where round(id)=10; 
说明,此时id的索引已经不起作用了 正确的例子:首先建立函数索引, 
create index test_id_fbi_idx on test(round(id)); 
然后 select * from test where round(id)=10; 这时函数索引起作用了

猜你喜欢

转载自blog.csdn.net/qq_37570710/article/details/112463309