↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2
历史版本PostgreSQL 7.3 已于 2007 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

第 8 章 索引

索引是增强数据库性能的一种常用手段。索引让数据库服务器能够比没有索引时快得多地找到并检索特定的行。但索引也会给整个数据库系统带来开销,因此应该合理地使用它们。

8.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 命令来更新统计信息,使查询规划器能够做出有根据的决策。关于如何查明索引是否被使用,以及规划器在何时、为何可能选择不使用索引,另请阅读 第 10 章。

索引也可以让带有搜索条件的 UPDATE 和DELETE 命令受益。此外,索引还可以用于连接查询。因此,在作为连接条件一部分的列上定义的索引,可以显著加快带连接的查询。

创建索引后,系统必须让索引与表保持同步。这会给数据操作操作带来开销。因此,非必需或根本不会被用到的索引应该被删除。注意,一条查询或数据操作命令对每个表最多只能使用一个索引。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。