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; 这时函数索引起作用了