Chapter 11. 索引

Table of Contents
11.1. 介绍
11.2. 索引类型
11.3. 多字段索引
11.4. 组合多个索引
11.5. 唯一索引
11.6. 表达式上的索引
11.7. 部分索引
11.8. 操作符表
11.9. 检查索引的使用

索引是提高数据库性能的常用方法。 索引可以令数据库服务器以比没有索引快得多的速度查找和检索特定的行。 不过索引也在总体上增加了数据库系统的过荷, 因此我们应该有意识地使用它们。

11.1. 介绍

索引使用的一个经典的例子就是有象下面这样的一个表∶

CREATE TABLE test1 (
    id integer,
    content varchar
);

并且应用需要大量的从下面查询语句进行的查询

SELECT content FROM test1 WHERE id = constant;

通常,数据库系统将不得不一行一行地扫描整个 test1 以寻找所有匹配的记录。 如果在 test1 里面有许多行, 但是只返回少数几行(可能是零个或者是一个), 那么上面这个方法可就不是个有效的方法。 如果我们让数据库系统在 id 列上维护一个索引用于定位匹配的行。 这样,数据库系统就可能只需要在搜索树中走少数的几层就可以找到匹配行。

在大多数非小说的书籍里面都使用了类似这样的方法∶ 在书的背后收集着读者会经常查找的术语和概念的索引, 并按照字母顺序排列。 有兴趣的读者可以相对快速地扫描该索引并且切换到合适的页, 因此就不用阅读整本书才能查找到感兴趣的位置。 作者的任务之一就是预计哪些项是读者最需要查找的东西, 与之类似,预计哪些索引可以带来便利也是数据库程序员的任务。

下面的命令可以用于在 id 列上创建我们讨论那样的索引∶

CREATE INDEX test1_id_index ON test1 (id);

你可以自由选择索引名字 test1_id_index, 但是应该选那些稍后可以让你回忆起你的索引是干什么的名字。

要删除一个索引,使用 DROP INDEX 命令。 你可以在任何时候向表里增加索引或者从表中删除索引。

一旦你创建了索引,那么就不在需要更多的干涉了∶ 当系统认为用索引比顺序的表扫描快的时候它就会使用索引。 不过你可能必须经常性地运行ANALYZE 命令以更新统计信息,好让查询规划器能够做出有训练的判断。 参见 Chapter 13 获取关于如何获知是否使用了索引的信息, 以及在何时何因下规划器会决定使用索引。

索引对带搜索条件的 UPDATEDELETE 也有好处。 索引更可以用于表连接查询。因此,如果你定义了索引的列是连接条件的一部分, 那么它可以显著提高带连接的查询的速度。

在创建索引的时候,它必须和表保持同步。这些操作增加了数据操作的负荷。 因此我们应该把那些非关键或者根本用不上的索引删除掉。