首页 > 编程知识 正文

复合索引在什么情况下失效,oracle复合索引

时间:2023-05-05 05:23:49 阅读:182331 作者:1341

概要

什么是单一索引和复合索引? 创建新的复合索引时,复合索引需要注意什么? 本文主要总结了网上的一些讨论。

一.概念

单个索引是指索引列为单个列时的情况。 这意味着新索引的语句只能在一列中实现。

用户可以对多个列创建索引。 此索引称为复合索引(复合索引)。 创建复合索引的方法与创建单个索引的方法完全相同。 但是,复合索引在数据库操作过程中需要较少的开销,可以代替多个单个索引。 如果表中的行数远远大于索引键的数量,则使用此方法可以大大加快表查询的速度。

有两个概念:窄索引和宽索引。 狭窄索引是指索引列为1-2列的索引,如果未明确说明,则为单个索引。 宽索引是指索引列数超过两列的索引。

设计索引的一个重要原则是使用窄索引而不使用宽索引。 因为狭窄的索引往往比组合索引更有效。 拥有更多的狭窄索引为优化程序提供了更多的选择,并有助于提高性能。

二.使用

编制索引

createindexidx1ontable1(col1、col2、col3) )。

查询

select * from table1where col1=aand col2=band col3=c

在这种情况下,查询优化程序直接从索引中获取数据,而不是扫描表。 因为索引中有这些数据,所以这被称为开销查询,这样的查询非常快。

三.注意事项

1 .什么时候使用复合索引

where条件对字段使用索引,而对多字段使用复合索引。 通常,不要对select中的字段创建索引。 查询select col1、col2、col3 from mytable时,不需要以上索引。 根据where条件建立索引是一个极其重要的原则。 请注意不要过度使用索引。 否则,在处理表时索引会花费很多时间,从而严重影响表的更新效率。

2 .对于复合索引,使用查询时,效率最高的方法是将条件顺序设置为查找索引的顺序。 例如:

idx 1: createindexidx1on table1(col 2、col3、col5) )。

select * from table1where col2=aand col3=band col5=d

' select * from table1where col3=band col2=aand col5=d '时

或者,' select * from table1 where col3=B '不使用索引或效果不佳

3 .复合索引会代替单个索引吗?

许多人认为,向聚合索引中添加哪些字段可以加快查询的速度。 另外,如果单独查询复合聚合索引字段,查询速度会变慢吗? 带着这个问题,看看下面的查询速度。 (结果集全部为25万件数据。 ) )日期列fariqi首先在复合聚集索引的第一列,用户名neibuyonghu在后面) )。

idx 1: createindexidx1on tgongwen (fariqi,neibuyonghu ) )。

(1) select gid,fariqi,neibuyonghu,titlefromtgongwenwherefariqi ' 2004-5-5 '

查询速度: 2513毫秒

)2) select gid,fariqi,neibuyonghu,titlefromtgongwenwherefariqi ' 2004-5-5 ' andneibuyonghu='办公室'

查询速度: 2516毫秒

)3) select gid,fariqi,neibuyonghu,titlefromtgongwenwhereneibuyonghu='办公室'

查询速度: 60280毫秒

从以上实验可知,仅将聚集索引的开头列作为查询条件使用时和同时使用复合聚集索引的所有列时的查询速度大致相同,比使用所有复合索引列时稍快(例如

果仅用复合聚集索引的非起始列作为查询条件的话,这个索引是不起任何作用的。当然,语句1、2的查询速度一样是因为查询的条目数一样,如果复合索引的所有列都用上,而且查询结果少的话,这样就会形成“索引覆盖”,因而性能可以达到最优。同时,请记住:无论您是否经常使用聚合索引的其他列,但其前导列一定要是使用最频繁的列。

[参考: 查询优化及分页算法方案 http://blog.csdn.net/chiefsailor/archive/2007/05/28/1628339.aspx]


4.需要在同一列上同时建单一索引和复合索引么?

试验: sysbase   5.0   表table1   字段:col1,col2,col3  

试验步骤:  

(1)建立索引idx1   on   col1  

  执行select   *   from   table1   where   col1=A     使用idx1  

  执行select   *   from   table1   where   col1=A   and   col2=B   也使用idx1  

(2)删除索引idx1,然后建立idx2   on   (col1,col2)复合索引  执行以上两个查询,也都使用idx2  

(3)如果两个索引idx1,idx2都存在  

  并不是   where   col1='A'用idx1;where   col1=A   and   col2=B  用idx2。  

  其查询优化器使用其中一个以前常用索引。要么都用idx1,要么都用idx2.  

由此可见,

(1)对一张表来说,如果有一个复合索引 on   (col1,col2),就没有必要同时建立一个单索引 on col1。

(2)如果查询条件需要,可以在已有单索引 on col1的情况下,添加复合索引on   (col1,col2),对于效率有一定的提高。

(3)同时建立多字段(包含5、6个字段)的复合索引没有特别多的好处,相对而言,建立多个窄字段(仅包含一个,或顶多2个字段)的索引可以达到更好的效率和灵活性。

5. 一定需要覆盖性查询么?

覆盖性查询:select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖。

通常最好不要采用一个强调完全覆盖查询的策略。如果Select子句中的所有列都被一个非群集索引覆盖,优化程序会识别出这一点,并提供很好的性能。不过,这通常会导致索引过宽,并会过度依赖于优化程序使用该策略的可能性。通常,是用数量更多的窄索引,这对于大量查询来说可以提供更好的性能。

总结:

1.尽量使用窄索引。即时是在使用覆盖性查询的时候

2.索引过多反而会降低数据库的性能

3.除非在使用or条件时,需要在or之间的每个条件上使用单一索引,否则窄索引的复合索引和单一索引是没有明显区别的

4.注意索引的使用顺序和建立顺序。无论您是否经常使用聚合索引的其他列,但其前导列一定要是使用最频繁的列。

出处:http://www.cnblogs.com/wenly/articles/1240321.html




版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。