数据库索引失效的N种情况

数据库索引分类:主键索引、唯一索引、组合索引、普通索引、全文索引
在以下这些情况种,执行引擎将放弃使用索引而进行全表扫描

1、在 where 子句中使用 != 或 <> 操作符
2、在 where 子句中使用 or 来连接条件,当连接的字段有字段没有索引时,将导致所有字段的索引失效(待验证)
3、在 where 子句中条件列类型是字符串,=后面的值没有加单引号
4、在 where 子句中like的模糊匹配以 % 开头
5、在where 子句中在等号左边对字段进行表达式或函数操作,这样将导致操作后字段结果值对引擎来说不可预知
6、如果执行引擎估计使用全表扫描要比使用索引快,则不使用索引
7、在where 子句中使用in 和 not in。使用exists,或连续区间使用between来代替in 和 not in可以防止索引失效

特别的,组合索引在以上7中情况下也会有对应的索引失效,而且当组合索引不满
足最左匹配原则时,组合索引会完全失效。下面描述组合索引生效的情况,通过与
下列情况对比,则可以判断具体的where条件组合索引是否失效

在B+树索引中,建立组合索引 index(a,b,c,d),能够用到索引的情况如下:

1、a=x 用到a的索引
2、a=x and b=x 用到ab的索引
3、a=x and b=x and c=x 用到abc的索引
4、a=x and b=x and c=x and d=x 用到abcd的索引
5、c=x and a=x and d=x and b=x 乱序的,执行引擎可能对其进行重排,因此是否使用索引应通过执行计划确认。
6、a=x and c=x或a=x and b=x and d=x (1)式用到a的索引,(2)式用到ab的索引。符合最左前缀但不连续的,从不连续的字段不会用到索引。
7、a=x and b=x and c 这些情况都满足最左匹配原则,因此不满足这个原则时,组合索引会完全失效。

你可能感兴趣的:(数据库)