CREATE INDEX

Name

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 高度并发 btrees 的实现.

RTREE

用 Guttman 分裂法做的标准 rtrees 的实现.

HASH

一个Litwin 线性哈希(散列)法的实现.

column

表的列/字段名.

ops_name

一个关联的操作符表.参阅下文获取细节。

func_name

一个函数,其返回值可被索引.

输出

CREATE

索引成功创建的返回信息.

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

如果不能创建索引,返回此信息.

描述

CREATE INDEX 在指定的表 table 上构造一个名为 index_name 的索引.

小技巧: 索引主要用来提高数据库性能.但是如果不恰当的使用将导致性能的下降.

在上面第一个语法里,索引的键字以列/字段名声明. 如果索引的访问模式支持多列索引,我们也可以声明多个字段.

在上面显示的第二种语法中,索引是以用户定义的函数 func_name 的结果定义的, 该函数应用于一个表的一个或多个字段. 这些函数索引(functional indices) 可用于获取更快的数据访问速度, 尤其在这些数据的操作是基于一些需要做一定转换才能应用基本数据的操作符时.

Postgres 为从索引提供 btree,rtree 和 hash(散列)访问模式。 btree 访问模式是一个 Lehman-Yao 高并发 btrees 的实 现。rtree 访问模式用 Guttman 的二次分裂算法实现了标准的 rtrees。 hash(散列)访问模式是 Litwin 的线性散列的一个实现。 我们单独的列出这些所用的算法是要表明所有这些访问模式 都是完全动态的并且不必进行周期性的优化(例如,象 静态散列算法常见的那样)。

使用 DROP INDEX 删除一个索引.

注意

当一个索引了的字段涉及到使用: <, <=, =, >=, > 之一进行比较时, Postgres 的查询优化器将考虑在扫描中使用btree 索引。

当一个索引了的字段涉及到使用: <<, &<, &>, >>, @, ~=, && 之一进行比较时, Postgres 的查询优化器将考虑在扫描中使用 rtree 索引。

当一个索引了的字段涉及到使用 = 操作符 进行比较时, Postgres 的查询优化器将考虑在扫描中使用散列(hash)索引。

目前,只有 btree 访问模式支持多字段索引。 缺省时最多可以声明 16 个键字(这个限制可以在制作 Postgres 时修改).

可以为索引的每个列/字段声明一个 操作符表. 操作符表标识将要被该索引用于该列/字段的操作符. 例如, 一个4-字节整数的 btree 索引将使用 int4_ops 表; 这个操作符表包括4-字节整数的比较函数. 实际上,该域的数据类型的缺省操作符表一般就足够了. 某些数据类型有操作符表的原因是,它们可能有多于一个的有意义的顺序. 例如,我们对复数类型排序时有可能以绝对值或者以实数部分. 我们可以通过为该数据类型定义两个操作符表,然后在建立索引的时候选择 合适的表来实现.还有些操作符表有特殊的用途:

下面的查询显示所有已定义的操作符表:

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 命令.