数据库索引的选择

数据库索引的选择

虽然索引的作用是加快查询,但却也需要空间存储,而且建立不当的索引可能对查询速度的帮助并不是很大,所以该不该建立索引,选择建立怎样的索引是一个需要考虑的问题。以下几条给出了建立索引的建议(主要基于Ramakrishnan和Gehrke的书《Database Management Systems》)

1.对于某个或某些查询是否建立索引?

不是所有查询都可以使用索引,比如没有where子句的查询,它不针对任何属性,所以用不上索引。

另外,该索引是否能使用在多个查询语句上呢?如果有多个查询语句能使用该索引,说明比较值得去使用。如果只能使用在单个查询的索引,则要考虑是否使用频繁。否则建立索引所花费的时间和空间不如直接使用查询的效率高。

2. Search Key 的选择

Search Key就是每个索引实体(index entries)上的键,一般是从where子句上的属性选出来的。

如果是点查询(Point Query),则用hash index。因为通过hash映射就可以直接找到要查询数据所在的地址。

但如果是范围查询(Range Query),则B+ 树这种树结构且叶子结点上的记录按顺序排列的结构比较高效。

3.多个属性需要建立索引的情况

在多个属性上建立索引叫复合索引(multiple index)。以下情况需要考虑

where子句有来自于多个关系的属性

不一定所有的索引属性是where子句的一部分,举个例子

SELECT * FROM customer WHERE name="Jsensen" AND street = "Elm" AND state = "Arizona"

我们可以创立一个(name,street, city)的属性,即使city不属于where子句中的属性。

4.是否需要聚簇索引(clustering index)

聚簇索引能大大地提高查询尤其是范围查询的速度,但是每个数据库只能有一个聚簇索引,如果有在不同属性上的范围查询,则要根据查询的频率和范围的比例来确定是否对该属性建立聚簇索引。

5.基于哈希的索引还是基于树的索引

通常来说选择的是基于树的索引,如B+树。因为它不仅能处理点查询(point query)也能处理范围查询。但下情况会考虑基于哈希的索引:

经常使用的是点查询,而没有范围查询

基于索引的嵌套循环连接(index-based nested loops join),这是一种使用索引关系作为内连接关系的方法,详细的会在之后文章讲解

6.维护索引所需的开销

什么是维护索引的开销呢?主要是指频繁更新索引需要花很多时间,当超过能给查询带来的性能提升时,不如删掉该索引。