索引失效是指在使用索引时,由于某些原因导致索引无法正常工作或失效的情况。以下是一些导致索引失效的情况:
没有查询条件或者查询条件没有建立索引。
在查询条件上没有使用索引列。
查询语句中的查询列都是索引列,这种情况被称为覆盖索引,此时查询所有列的数据,非索引列不会走索引。
查询条件使用函数在索引列上,这种情况应当创建基于函数的索引。
隐式转换导致索引失效,例如表的字段定义是varchar2(20),但在查询时把该字段作为number类型以where条件传给Oracle,会导致索引失效。
对索引列进行运算(如+、-、*、/等)导致索引失效。
like模糊查询时,使用“%_”会导致索引失效。
查询条件单独引用复合索引里非第一位置的索引列。
对小表查询或者查询的数量没有达到一定比例(通常是30%以上)。
基于成本分析(如Oracle认为全表扫描成本更小)。
字符型字段为数字时在where条件里不添加引号。
如果条件中有or,即使其中有部分条件带索引也不会使用,要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引。
把两个单独建了索引的列,用来做列对比时索引会失效。
主键字段中使用not in关键字查询数据范围,可以走索引。而普通索引字段使用了not in关键字查询数据范围,索引会失效。
使用not exists时,索引也会失效。
order by语句中没有加where或limit关键字,该sql语句将不会走索引。
对多个索引进行order by时,如果它们的排序规律相同(如都升序或都降序),则可以走索引,如果一个字段是升序,另一个字段是降序,则索引会失效。
总之,索引失效的情况有很多种,需要根据具体情况进行分析和调整。在使用索引时,需要注意建立合适的索引,并正确地使用查询条件,以充分发挥索引的作用。