索引限制

Posted zhongyinghe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了索引限制相关的知识,希望对你有一定的参考价值。

1、使用不等于操作符(<>, !=)
下面这种情况,即使在列dept_id有一个索引,查询语句仍然执行一次全表扫描
select * from dept where staff_num <> 1000;
但是开发中的确需要这样的查询,难道没有解决问题的办法了吗?
有!
通过把用 or 语法替代不等号进行查询,就可以使用索引,以避免全表扫描:上面的语句改成下面这样的,就可以使用索引了。

select * from dept shere staff_num < 1000 or dept_id > 1000; 

 

2、使用 is null 或 is not null

 

3、使用函数

如果没有使用基于函数的索引,那么where子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。下面的查询就不会使用索引:

select * from staff where trunc(birthdate) = ‘01-MAY-82‘; 

但是把函数应用在条件上,索引是可以生效的,把上面的语句改成下面的语句,就可以通过索引进行查找。

select * from staff where birthdate < (to_date(‘01-MAY-82‘) + 0.9999); 

 

4、比较不匹配的数据类型 

比较不匹配的数据类型也是难于发现的性能问题之一。
下面的例子中,dept_id是一个varchar2型的字段,在这个字段上有索引,但是下面的语句会执行全表扫描。

select * from dept where dept_id = 900198;  

这是因为oracle会自动把where子句转换成to_number(dept_id)=900198,就是3所说的情况,这样就限制了索引的使用。
把SQL语句改为如下形式就可以使用索引。

select * from dept where dept_id = ‘900198‘; 

 

参考:http://webnoties.blog.163.com/blog/static/183525141201310182313851/

以上是关于索引限制的主要内容,如果未能解决你的问题,请参考以下文章

了解非索引的mysql限制

Oracle 索引失效的六大限制条件

Google App Engine Datastore 中的索引和索引条目限制

电子索引数据库限制?

具有基于索引的限制的前向填充列

修改Mysql索引长度限制