2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:开发版
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2

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章

索引还可以使带有搜索条件的 UPDATEDELETE 命令受益。此外,索引可用于连接搜索。因此,在连接条件的一部分的列上定义的索引还可以显着加快带有连接的查询速度。

通常,PostgreSQL 索引可用于优化包含一个或多个 WHEREJOIN 子句的查询,其形式为

indexed-column indexable-operator comparison-value

这里,indexed-column 是索引已定义在其上的任何列或表达式。indexable-operator 是索引的运算符类中索引列的成员的运算符。(更多详细信息将在下面介绍。)comparison-value 可以是任何不具有易变性且不引用索引表的表达式。

在某些情况下,查询计划器可以从另一个 SQL 结构中提取此形式的可索引子句。一个简单的示例是,如果原始子句为

comparison-value operator indexed-column

则如果原始operator 具有作为索引运算符类的成员的交换运算符,则可以将其翻转为可索引形式。

在大型表上创建索引可能需要很长时间。默认情况下,PostgreSQL 允许在创建索引的同时并行对表进行读取(SELECT 语句),但写入(INSERTUPDATEDELETE)会被阻止,直到索引构建完成。在生产环境中,这通常是不可接受的。可以允许在创建索引的同时并行进行写入,但需要注意一些注意事项——有关更多信息,请参见并行构建索引

创建索引后,系统必须使其与表保持同步。这会增加数据操作操作的开销。索引还可以阻止创建仅堆元组。因此,应删除查询中很少或从未使用过的索引。

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步澄清的内容,请使用此表单报告文档问题。