oracle之索引优化

使用索引的目的:

创建主键和唯一索引的主要目的除了保证数据完整性和唯一性之外,还具有提高查询速度的作用。此外,创建一般索引的目的就是为了提高查询速度。那么如何才能发挥索引的作用呢?

何时使用索引

在利用索引的情况下,用于只从表中选择部分行,才能提高查询速度。创建索引有几个基本原则:
1)以查询关键字为基础,表中的行随机排序
注:如果数据时有序排序的,那么其实就没必要使用索引了,因为索引本质上也是对数据做了排序。
2)包含的列数相对比较少的表
3)表中大多数查询都包含相对简单的where从句
注:where字句中所涉及的字段上建立索引能够提高查询的效率

索引列和表达式的选择

单列索引的选择要点:

1)where从句频繁使用的字段

2)SQL语句中频繁进行表关联的字段

3)可选择性高的关键字

4)对于取值较少的关键字或表达式,不要采用标准的B树索引,可以使用位图索引

5)不要将频繁修改的列作为索引列
注:索引是物理存在,需要占用资源,而且索引会随着表的更新而更新,如果在频繁修改的列上建立索引,则会导致表更新的小效率降低!!!

复合索引的选择要点:

复合索引有时比单列索引有更好的性能。如果在建立索引时采用了几个列作为索引,则在使用时也按照建立是的顺序来用,也就是“最佳左前缀原则”。
在使用复合索引的时候查询语句中必须要带有WHERE…AND

注:为什么复合索引的性能有时会优于单列索引呢?
其实很好理解,假如我们查询某张表的某两列,而此时恰好以这两列建立了复合索引,那么很显然此时的查询效率是高于单列索引的。

才是用复合索引列的字段时,要遵循以下原则:

1)如果某些字段在where从句中的使用频率较高,则考虑创建复合索引

2)如果某些字段在where从句中的使用频率相当,则创建索引时考虑按照从高到低的顺序来说明字段

3)如果几个查询都选择同样的字段集合,则考虑使用复合索引

4)创建索引之后使用where从句所使用的字段能够组成前导部分
注:如果我们在某张表的A、B、C字段上建立了一个符合索引,那么我们想要使用到该复合索引那么在where字句中必须写成where A… and B… and C… [and 其他]的形式,这既是所谓的组成前导部分

5)应该选择在where从句条件中频繁使用的字段,并且这些字段由AND操作符连接

索引失效的情况

有时候我们即使创建了索引,但是在写SQL时如果不注意某些细节的话,会导致索引失效,从而是查找转向全表扫描,一下是到时索引失效的几种常见情况:
1)单列索引中使用like关键字,且%在前,会导致索引失效
举个例子:
如果T表中A字段上有一个单列索引,现在要查找A字段上包含B的数据,此时生成的sql应为:

select t.*
from T t
where A like '%B%'

此时就是上述的情况:%在前,那么此时再换一个查询条件,将需求查找改为A字段以B开头的所有数据,此时的sql为:

select t.*
from T t
where A like 'B%';

此时%并不在前,并不会导致索引失效。

2)带有is null、is not null或!=等计算符会导致索引失效,转向全表扫描

3)违背最佳左前缀原则会导致索引失效
注:如果在T表中的A、B、C字段上建立了一个符合索引,那么在使用的时候where字句必须写成:where A… and B… and C…如果写成where B… and A… and C…则会导致索引失效

4)索引列涉及的字段没有全部在where字句中使用,转向全表扫描
注:如果在T表中的A、B、C字段上建立了一个符合索引,那么在使用的时候where字句必须写成:where A… and B… and C…如果写成where A… and B…或where A… and B…等其他索引列不全的情况,则会导致索引失效

5) 索引列上使用了函数,在查询时会导致索引失效,除非在该列上创建函数索引

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值