单一索引和复合索引的区分与联系- sydst日志-网络博客http://select good boy.blog.163.com/blog/static/103212061201519117118 /
什么是单一索引和复合索引? 创建新的复合索引时,复合索引需要注意什么? 本文主要总结了网上的一些讨论。
一.概念
单个索引是指索引列为单个列时的情况。 这意味着新索引的语句只能在一列中实现。
用户可以对多个列创建索引。 此索引称为复合索引(复合索引)。 创建复合索引的方法与创建单个索引的方法完全相同。 但是,复合索引在数据库操作过程中需要较少的开销,可以代替多个单个索引。 如果表中的行数远远大于索引键的数量,则使用此方法可以大大加快表查询的速度。
有两个概念:窄索引和宽索引。 狭窄索引是指索引列为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,title from Tgongwen
where fariqi'2004-5-5 '
查询速度: 2513毫秒
)2) select gid,fariqi,neibuyonghu,title from Tgongwen
were fariqi ' 2004-5-5 ' andneibuyonghu='办公室'
查询速度: 2516毫秒
)3) select gid,fariqi,neibuyonghu,title from Tgongwen
where neibuyonghu='办公室'
查询速度: 60280毫秒
从以上实验可知,仅使用聚集索引的第一列作为查询条件时和同时使用复合聚集索引的所有列时的查询速度大致相同,比使用所有复合索引列时稍快(复合聚集索引当然,语句1和2的查询速度相同是因为查询的项数相同。 如果复合索引中的所有列都已使用,并且查询结果很少,则会形成“索引复盖率”,从而优化性能。 此外,请注意,无论是否经常使用聚合索引中的其他列,第一列始终是最频繁的。
:查询优化和分页算法方案,见http://blog.csdn.net/chief sailor/archive/2007/05/28/1628339.aspx ]
4 .是否需要在同一列上同时创建单个索引和复合索引?
试验: sysbase 5.0表1字段: col1、col2、col3
试验步骤:
)1)创建索引idx1 on co
l1执行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子句中的所有列都被一个非群集索引覆盖,优化程序会识别出这一点,并提供很好的性能。不过,这通常会导致索引过宽,并会过度依赖于优化程序使用该策略的可能性。通常,是用数量更多的窄索引,这对于大量查询来说可以提供更好的性能。