1
数据库原理与应用技术
1.5.6.2 4.6.2 索引设计
4.6.2 索引设计

在关系数据库中,数据都组织在基本表中。如果表中未建立任何存取路径,则系统只能通过顺序扫描来查找特定元组。此时若表中元组数多,则存取速度很慢。

索引(Index)是与基本表相关联的一种数据结构,它提供了另外的存取路径,可以加快对表中元组的检索速度;进而提高表之间的连接速度,提高对表中数据的修改和删除速度。大多数情况下,使用索引比全表顺序扫描合算,因为大多数SQL语句只是要抽取表中某些特定的行而不是所有行。

索引设计的任务是决定在哪些表上建立索引,在表的哪些列上建立索引,何时建立索引。这是关系数据库物理设计的基本问题,对数据库性能影响很大。

可以在表中的一个属性上建立索引,也可以在一组属性上建立索引(称为组合索引)。一个表上可建立多个索引,甚至可在每列上建立索引。但是索引并非越多越好,原因有二:其一,随着表中数据的变化,需要维护表上的所有索引,过多的索引将导致维护开销太大,甚至使系统存取速度下降;其二,索引本身是有存储开销的。

1. 何时建立索引

凡符合下列条件之一,可以考虑在有关属性上建立索引,下面所指的查询都是常用的或重要的查询。

(1) 主码和外码上一般都应建立索引,这有利于实施实体完整性和参照完整性检查。在检索参照完整性约束,删、改主码时,需要检查有无引用此主码的外码;在增、改外码时,要检查是否有对应的主码。在主码和外码上都建立索引,显然可以方便这种检查。

(2) 对于以读为主或只读的表,只要存储空间允许,就可以多建立索引,因为很少或不需对表进行操纵,所以很少或不需维护索引,此时索引再多也不会引起副作用。

(3) 对于等值查询(查询条件以等号为比较符),如果满足条件的元组是少量的,例如小于5%,则可以考虑在有关属性上建立索引。

(4) 如果一个(或一组)属性经常在查询条件中出现,则可考虑在这个(或这组)属性上建立索引。

(5) 如果一个(或一组)属性经常在连接操作的条件中出现,则可考虑在这个(或这组)属性上建立索引。

(6) 有些查询可以从索引直接得到结果,不必访问数据块。对于这种查询,在有关属性上建立索引是有益的。这些查询包括:某属性的MAX、MIN、AVG、SUM、COUNT等聚集函数值(无Group By子句),可沿该属性的索引的顺序集扫描直接求得结果;某属性值EXISTS或NOT EXISTS,只要通过该属性的索引就可获得结果,不必访问数据块。

2. 何时不宜建索引

凡是满足下列条件之一的属性或表,可能不宜建立索引。

(1) 不出现或很少出现在查询条件中的属性。

(2) 属性值很少的属性。例如,属性“性别”只有两个值,若在其上建立索引,则每个属性值只对应一半的元组;用索引检查还不如用顺序扫描。

(3) 经常更新的属性或表,因为更新时需要维护索引。

(4) 过长的属性,如超过30个字节的属性。在过长的属性上建立索引,索引所占的存储空间较大,而且索引级数也随之增加。

(5) 太小的表,因为此时顺序扫描很快。