1.前导模糊查询不能利用索引(like '%XX'或者like '%XX%')数据库
假若有这样一列code的值为'AAA','AAB','BAA','BAB' ,若是where code like '%AB'条件,因为前面是函数
模糊的,因此不能利用索引的顺序,必须一个个去找,看是否知足条件。这样会致使全索引扫描或者全表扫spa
描。若是是这样的条件where code like 'A % ',就能够查找CODE中A开头的CODE的位置,当碰到B开头的3d
数据时,就能够中止查找了,由于后面的数据必定不知足要求。这样就能够利用索引了。code
2.若是是组合索引的话,若是不按照索引的顺序进行查找,好比直接使用第三个位置上的索引而忽略第一二个位置上的索引时,则会进行全表查询blog
索引为c1,c2,c3,c4索引
上图结果显示直接使用c3是全表查询,没法使用该索引的,因此c3字段使用索引的前提是c1,c2两字段均使用了索引。rem
3.条件中有orstring
应尽可能避免在 where 子句中使用 or 来链接条件,不然将致使引擎放弃使用索引而进行全表扫描,如:it
select id from t where num=10 or num=20
能够这样查询:
select id from t where num=10 union all select id from t where num=20
4.索引没法存储null值,因此where的判断条件若是对字段进行了null值判断,将致使数据库放弃索引而进行全表查询,如
select id from t where num is null
能够在num上设置默认值0,确保表中num列没有null值,而后这样查询:
select id from t where num=0
a.单列索引没法储null值,复合索引没法储全为null的值。
b.查询时,采用is null条件时,不能利用到索引,只能全表扫描。
为何索引列没法存储Null值?
a.索引是有序的。NULL值进入索引时,没法肯定其应该放在哪里。(将索引列值进行建树,其中必然涉及到诸多的比较操做,null 值是不肯定值没法比较,没法肯定null出如今索引树的叶子节点位置。)
5.应尽可能避免在 where 子句中使用!=或<>操做符,不然将引擎放弃使用索引而进行全表扫描。
6.in 和 not in 也要慎用,不然会致使全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
7. 应尽可能避免在where子句中对字段进行函数操做,这将致使引擎放弃使用索引而进行全表扫描。如:
–name以abc开头的id
select id from t where substring(name,1,3)='abc'
8.应尽可能避免在 where 子句中对字段进行表达式操做,这将致使引擎放弃使用索引而进行全表扫描。如:
select id from t where num/2=100
应改成:
select id from t where num=100*2