pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
CREATE INDEX — 定义一个新索引
CREATE [ UNIQUE ] INDEXnameONtable[ USINGmethod] ( {column| (expression) } [opclass] [, ...] ) [ TABLESPACEtablespace] [ WHEREpredicate]
CREATE INDEX 在指定表上构造一个索引 index_name。索引主要用于提升数据库性能(但使用不当也可能导致性能下降)。
索引的键字段指定为列名,或者指定为写在圆括号中的表达式。 如果索引方法支持多列索引,则可以指定多个字段。
索引字段可以是根据表行中一个或多个列值计算得到的表达式。 该特性可用于根据基础数据的某种变换来快速访问数据。例如, 在upper(col)上计算的索引可让子句 WHERE upper(col) = 'JIM'使用索引。
PostgreSQL提供了四种索引方法: B-树、R-树、hash 和 GiST。B-树索引方法是 Lehman-Yao 高并发 B-树的一种实现。R-树索引方法使用 Guttman 的二次分割算法实现标准 R-树。hash 索引方法是 Litwin 线性散列的一种实现。用户也可以定义自己的索引方法,但这相当复杂。
当WHERE子句存在时,会创建一个 部分索引。部分索引只包含表中一部分行的索引项, 通常这一部分比表的其余部分更适合建立索引。例如,如果一个表同时包含 已开票和未开票订单,而未开票订单只占整个表的一小部分,但这一部分又经常 被访问,就可以只对这部分创建索引来提升性能。另一种可能 的应用是将WHERE与UNIQUE结合使用, 以便在表的一个子集上强制唯一性。更多讨论请见 第 11.7 节。
WHERE子句中使用的表达式只能引用底层表的列,但 它可以使用所有列,而不仅仅是被索引的列。当前, WHERE中也禁止使用子查询和聚合表达式。同样的 限制也适用于作为表达式的索引字段。
所有在索引定义中使用的函数和操作符都必须是“不可变的”, 也就是说,它们的结果只能依赖其参数,而不能受任何外部因素影响 (例如另一个表的内容或当前时间)。这种限制确保索引的行为定义明确。 要在索引表达式或WHERE子句中使用用户定义的函数, 记得在创建该函数时将其标记为不可变。
UNIQUE使系统在创建索引时(如果数据已经存在)以及每次添加数据时, 检查表中的重复值。任何会导致重复项的插入或更新操作都会报错。
name要创建的索引名称。此处不能包含模式名称;索引始终创建在其父表所在的同一模式中。
table要建立索引的表名(可以是模式限定名)。
method要使用的索引方法的名称。选择包括 btree、hash、 rtree 和 gist。默认方法是 btree。
column一个表列的名称。
expression一个基于表中一个或多个列的表达式。通常必须像语法中所示那样写在 外围圆括号中。不过,如果该表达式是函数调用形式,则可以省略圆括号。
opclass一个操作符类的名称。详见下文。
tablespace在其中创建索引的表空间。如果未指定,将查阅 default_tablespace;如果 default_tablespace是空字符串,则使用数据库的默认表空间。
predicate部分索引的约束表达式。
关于索引何时能被使用、何时不被使用以及什么情况下它们有用的信息请 见第 11 章。
目前,只有 B-树和 GiST 索引方法支持多列索引。默认最多可指定 32 个字段。(构建PostgreSQL时可以更改此限制。)目前只有 B-树 支持唯一索引。
索引的每一列都可以指定一个操作符类。操作符类标识索引用于该列的操作符。例如,四字节整数上的 B-树 索引会使用int4_ops类;此操作符类包含四字节整数的比较函数。实际上,列数据类型的默认操作符类通常已足够。操作符类存在的主要原因是,某些数据类型可能有多个有意义的排序方式。例如,我们可能希望按绝对值或实部对复数数据类型排序。我们可以为该数据类型定义两个操作符类,并在创建索引时选择合适的类。有关操作符类的更多信息,请参见第 11.8 节和第 32.14 节。
使用DROP INDEX删除索引。
默认情况下,索引不会被用于IS NULL子句。在这种情况下 使用索引的最佳办法,是创建一个使用IS NULL谓词的 部分索引。
创建 B-树索引,列为title,所在表为films:
CREATE UNIQUE INDEX title_idx ON films (title);
要在表films的列code上创建一个索引, 并让该索引驻留在表空间indexspace中:
CREATE INDEX code_idx ON films (code) TABLESPACE indexspace;
CREATE INDEX是 PostgreSQL的语言扩展。SQL 标准中没有关于 索引的规定。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。