索引失效的几种情况

浏览: 913
SQL

1.类型不一致导致索引失效.

由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效:

错误的例子:select * from test where tu_mdn=13333333333;

正确的例子:select * from test where tu_mdn='13333333333';

2.对索引列进行运算导致索引失效,索引列运算包括(+,-,*,/,! 等)

 错误的例子:select * from test where id-1=9;

 正确的例子:select * from test where id=10;

3.使用Oracle内部函数导致索引失效.对于这样情况应当创建基于函数的索引.

 错误的例子:select * from test where round(id)=10; 说明,此时id的索引已经不起作用了 

正确的例子:首先建立函数索引,create index test_id_fbi_idx on test(round(id));

然后 select * from test where  round(id)=10; 这时函数索引起作用了

4.以下使用会使索引失效,应避免使用;

a. 使用 <> 、not in 、not exist、!=

b. like "%_" 百分号在前(可采用在建立索引时用reverse(columnName)这种方法处理)

c. 单独引用复合索引里非第一位置的索引列.应总是使用索引的第一个列,如果索引是建立在多个列上, 只有在它的第一个 列被where子句引用时,优化器才会选择使用该索引。

d. 字符型字段为数字时在where条件里不添加引号.

e. 当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。

5.不要将空的变量值直接与比较运算符(符号)比较。

如果变量可能为空,应使用 IS NULL 或 IS NOT NULL 进行比较,或者使用 ISNULL 函数。

6.不要在 SQL 代码中使用双引号。

因为字符常量使用单引号。如果没有必要限定对象名称,可以使用(非 ANSI SQL 标准)括号将名称括起来。

7.将索引所在表空间和数据所在表空间分别设于不同的磁盘chunk上,有助于提高索引查询的效率。

8.Oracle默认使用的基于代价的SQL优化器(CBO)非常依赖于统计信息,一旦统计信息不正常,会导致数 据库查询时不使用索引或使用错误的索引。

一般来说,Oracle的自动任务里面会包含更新统计信息的语句,但如果表数据发生了比较大的变化(超过 20%),可以考虑立即手动更新统计信息,例如:analyze table abc compute statistics,但注意,更新统计 信息比较耗费系统资源,建议在系统空闲时执行。

9.Oracle在进行一次查询时,一般对一个表只会使用一个索引.

因此,有时候过多的索引可能导致Oracle使用错误的索引,降低查询效率。例如某表有索引1(Policyno) 和索引 2 ( classcode ),如果查询条件为 policyno = ‘ xx ’ and classcode = ‘ xx ’ ,则系统有可能会使用索引 2,相较于使用索引1,查询效率明显降低。

10.优先且尽可能使用分区索引。

11.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)

12.对于多列索引,不是使用的第一部分,则不会使用索引

13.如果mysql估计使用全表扫描要比使用索引快,则不使用索引

此外,查看索引的使用情况可以使用以下语句:

show status like ‘Handler_read%';

handler_read_key 这个值越高越好,越高表示使用索引查询到的次数

handler_read_rnd_next 这个值越高,说明查询低效

感谢作者详细的讲解!

作者:CodingHou

链接:https://www.jianshu.com/p/ccdd8a089ea0

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

推荐 0
本文由 DDlucky 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册