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

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 / 7.1 / 7.0 / 6.5 / 6.4
历史版本PostgreSQL 7.0 已于 2005 年 5 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

CREATE INDEX

CREATE INDEX — 构建一个二级索引

大纲

CREATE [ UNIQUE ] INDEX index_name ON table
    [ USING acc_name ] ( column [ ops_name ] [, ...] )
CREATE [ UNIQUE ] INDEX index_name ON table
    [ USING acc_name ] ( func_name( column [, ... ]) [ ops_name ] )
  

输入

UNIQUE

使系统在创建索引时(如果数据已存在)以及每次添加数据时检查表中 的重复值。试图插入或更新会导致重复项的数据将产生一个错误。

index_name

要创建的索引名称。

table

要建立索引的表名。

acc_name

用于索引的访问方法的名称。默认访问方法是 BTREE。 Postgres 为索引提供了三种访问方法:

BTREE

Lehman-Yao 高并发 B-树的一个实现。

RTREE

使用 Guttman 的二次分裂算法实现标准 R-tree。

HASH

Litwin 线性散列的一个实现。

column

表中一个列的名称。

ops_name

一个关联的操作符类。详见下文。

func_name

一个返回可索引值的函数。

输出

CREATE

索引成功创建时返回的消息。

ERROR: Cannot create index: 'index_name' already exists.

无法创建索引时出现此错误。

描述

CREATE INDEX 在指定的 table 上构建一个索引 index_name。

提示

索引主要用于提升数据库性能。但使用不当会导致性能下降。

在上面所示的第一种语法中,索引的键字段以列名指定。如果索引 访问方法支持多列索引,则可以指定多个字段。

在上面所示的第二种语法中,索引定义在把用户指定的函数 func_name 应用于单个类的 一个或多个属性所得到的结果上。这些函数索引可用于 基于操作符的快速数据访问,而这些操作符通常需要对基础数据做某种 变换才能应用。

Postgres 为索引提供了 btree、rtree 和 hash 访问方法。 btree 访问方法是 Lehman-Yao 高并发 btrees 的一个实现。rtree 访问 方法使用 Guttman 的二次分裂算法实现标准 rtrees。hash 访问方法是 Litwin 线性散列的一个实现。我们提到这些算法只是为了说明所有这些 访问方法都是完全动态的,不需要周期性地进行优化(例如静态 hash 访问方法就需要)。

使用 DROP INDEX 删除索引。

注解

每当一个被索引的属性出现在使用下列操作符之一的比较中时, PostgreSQL 的查询优化器就会考虑使用 B-tree 索引: <, <=, =, >=, >

每当一个被索引的属性出现在使用下列操作符之一的比较中时, PostgreSQL 的查询优化器就会考虑使用 R-tree 索引: <<, &<, &>, >>, @, ~=, &&

每当一个被索引的属性出现在使用 = 操作符的比较中时, Postgres 的查询优化器就会考虑使用 hash 索引。

目前,只有 btree 访问方法支持多列索引。默认最多可指定 16 个键(构建 Postgres 时可以更改此限制)。

索引的每一列都可以指定一个操作符类。操作符类 标识索引用于该列的操作符。例如,四字节整数上的 B-tree 索引会使用 int4_ops 类;此操作符类包含四字节整数的比较函数。 实际上,字段数据类型的默认操作符类通常已足够。操作符类存在的主要原因是, 某些数据类型可能有多种有意义的排序方式。例如,我们可能希望按绝对值 或实部对复数数据类型排序。我们可以为该数据类型定义两个操作符类, 然后在创建索引时选择合适的类。还有一些具有特殊用途的操作符类:

  • 操作符类 box_ops 和 bigbox_ops 都支持在 box 数据类型上建立 R-tree 索引。 它们之间的区别是 bigbox_ops 会将 box 坐标缩小, 以避免对非常大的浮点坐标做乘法、加法和减法时出现浮点异常。 如果矩形所在字段约为 20,000 平方单位或更大,则应使用 bigbox_ops。

  • int24_ops 操作符类适用于在 int2 数据上构建索引, 并在查询条件中与 int4 数据进行比较。类似地, int42_ops 支持在要与查询中的 int2 数据进行比较的 int4 数据上构建索引。

下面的查询列出所有已定义的操作符类:

SELECT am.amname AS acc_name,
       opc.opcname AS ops_name,
       opr.oprname AS ops_comp
    FROM pg_am am, pg_amop amop,
         pg_opclass opc, pg_operator opr
    WHERE amop.amopid = am.oid AND
          amop.amopclaid = opc.oid AND
          amop.amopopr = opr.oid
    ORDER BY acc_name, ops_name, ops_comp
    

用法

要在表 films 的字段 title 上 创建一个 btree 索引:

CREATE UNIQUE INDEX title_idx
    ON films (title);
  

兼容性

SQL92

CREATE INDEX 是 Postgres 的语言扩展。

SQL92 中没有 CREATE INDEX 命令。

提交更正

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