介绍

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 11. 索引 | 下一页

# 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`命令以更新统计信息， 好让查询规划器能够做出训练有素的判断。参见第 14 章 获取关于如何获知是否使用了索引的信息，以及在什么时候、什么原因下规划器会决定 不使用索引。

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

在一个巨大的表上创建索引可能会消耗大量的时间。缺省时，PostgreSQL 允许在创建索引的同时读取表(`SELECT`语句)，但是写入表(`INSERT`, `UPDATE`, `DELETE`)的动作将被阻塞到索引创建完毕。 在生产环境下这种阻塞通常是不可接受的。在创建索引的同时也允许写入表是可能的， 但是有一些警告需要注意，更多信息参见并发建立索引。

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

上一页 | 起始页 | 下一页
索引 | 上一级 | 索引类型