索引并不是时时都会失效的,比方以下几种状况,将导致索引生效:
1.如果条件中有or,即便其中有条件带索引也不会应用(这也是为什么尽量少用or的起因)
留神:要想应用or,又想让索引失效,只能将or条件中的每个列都加上索引
2.对于多列索引,不是应用的第一局部(第一个),则不会应用索引
3.like查问是以%结尾
4.如果列类型是字符串,那肯定要在条件中将数据应用引号援用起来,否则不应用索引
5.如果mysql预计应用全表扫描要比应用索引快,则不应用索引
此外,查看索引的应用状况
show status like ‘Handler_read%';
大家能够留神:
handler_read_key:这个值越高越好,越高示意应用索引查问到的次数
handler_read_rnd_next:这个值越高,阐明查问低效
others
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 "%_" 百分号在前.
4,表没剖析.
15,独自援用复合索引里非第一地位的索引列.
16,字符型字段为数字时在where条件里不增加引号.
17,对索引列进行运算.须要建设函数索引.
18,not in ,not exist.
19,当变量采纳的是times变量,而表的字段采纳的是date变量时.或相同状况。
20,B-tree索引 is null不会走,is not null会走,位图索引 is null,is not null 都会走
21,联结索引 is not null 只有在建设的索引列(不分先后)都会走, in null时 必须要和建设索引第一列一起应用,当建设索引第一地位条件是is null 时,其余建设索引的列能够是is null(但必须在所有列 都满足is null的时候),或者=一个值; 当建设索引的第一地位是=一个值时,其余索引列能够是任何状况(包含is null =一个值),以上两种状况索引都会走。其余状况不会走。