关于mysql:Mysql索引会失效的几种情况分析

3次阅读

共计 1226 个字符,预计需要花费 4 分钟才能阅读完成。

索引并不是时时都会失效的,比方以下几种状况,将导致索引生效:

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 = 一个值), 以上两种状况索引都会走。其余状况不会走。

正文完
 0