CREATE [ UNIQUE ] INDEX index_name ON table [ USING acc_method ] ( column [ ops_name ] [, ...] ) [ WHERE predicate ] CREATE [ UNIQUE ] INDEX index_name ON table [ USING acc_method ] ( func_name( column [, ... ]) [ ops_name ] ) [ WHERE predicate ]
令系统检测当索引创建时(如果数据已经存在) 和每次添加数据时表中是否有重复值.如果插入或更新的值 会导致重复的记录时将生成一个错误.
要创建的索引名.这里不能包含大纲名; 索引总是在同一个大纲中作为其父表创建的.
要索引的表名(可能有大纲修饰).
用于索引的访问模式.缺省访问模式是BTREE. PostgreSQL提供三种用于从索引的访问模式:
一个 Lehman-Yao 高度并发 B-trees 的实现.
用 Guttman 分裂法做的标准 R-trees 的实现.
一个Litwin 线性哈希(散列)法的实现.
通用索引搜索树(Generalized Index Search Trees).
表的列/字段名.
一个关联的操作符表.参阅下文获取细节。
一个函数,其返回值可被索引.
为一个部分索引定义约束表达式.
CREATE INDEX 在指定的表 table 上构造一个名为 index_name 的索引.
小技巧: 索引主要用来提高数据库性能.但是如果不恰当的使用将导致性能的下降.
在上面第一个语法里,索引的键字以列/字段名声明. 如果索引的访问模式支持多列索引,我们也可以声明多个字段.
在上面显示的第二种语法中,索引是以用户定义的函数 func_name 的结果定义的, 该函数应用于一个表的一个或多个字段. 这些函数索引(functional indices) 可用于获取更快的数据访问速度, 尤其在这些数据的操作是基于一些需要做一定转换才能应用基本数据的操作符时. 比如,一个在 upper(col) 上的函数索引将允许子句 WHERE upper(col) = 'JIM' 使用索引.
PostgreSQL 为从索引提供 B-tree,R-tree,hash(散列) 和 GiST 访问模式。 B-tree 访问模式是一个 Lehman-Yao 高并发 B-trees 的实 现。R-tree 访问模式用 Guttman 的二次分裂算法实现了标准的 R-trees。 hash(散列)访问模式是 Litwin 的线性散列的一个实现。 我们单独的列出这些所用的算法是要表明所有这些访问模式 都是完全动态的并且不必进行周期性的优化(例如,象 静态散列算法常见的那样)。
如果出现了 WHERE 子句,则创建一个 部分索引.部分索引是一个只包含表的 一部分记录的索引,通常是该表中最让人感兴趣的部分. 比如,如果你有一个表,里面包含已上账和未上账的定单, 未上账的定单只占表的一小部分而且这部分是最常用的部分, 那么你就可以通过只在这个部分创建一个索引来改善性能. 另外一个可能的用途是用 WHERE 和 UNIQUE 强制一个表的某个子集的唯一性.
在 WHERE 子句里用的表达式只能引用下层表 的子段(但是它可以使用所有字段,而不仅仅是被索引的字段). 目前,子查询和聚集表达式也不能出现在WHERE里.
索引定义里的所有函数和操作符都必须是immutable, (不变的) 也就是说,它们的结果必须只能依赖于它们的输入参数,而决不能 依赖任何外部的影响(比如另外一个表的内容或者当前时间). 这个约束确保该索引的行为是定义完整的.要在一个索引上使用 用户定义函数,请记住在你创建它的时候把它标记为immutable的函数.
使用 DROP INDEX 删除一个索引.
当一个索引了的字段涉及到使用: <, <=, =, >=, > 之一进行比较时, PostgreSQL 的查询优化器将考虑在扫描中使用B-tree 索引。
当一个索引了的字段涉及到使用: <<, &<, &>, >>, @, ~=, && 之一进行比较时, PostgreSQL 的查询优化器将考虑在扫描中使用 R-tree 索引。
当一个索引了的字段涉及到使用 = 操作符 进行比较时, PostgreSQL 的查询优化器将考虑在扫描中使用散列(hash)索引。
测试表明,PostgreSQL 的散列索引与 B-tree 索引类似或者更慢些, 而散列索引的大小和制作时间则更差。散列索引在高并发性的情况下 性能还很恶劣。因此,我们不建议使用散列索引。
目前,只有 B-tree 和 gist 访问模式支持多字段索引。 缺省时最多可以声明 32 个键字(这个限制可以在制作 PostgreSQL时修改). 目前只有 B-tree 支持唯一索引.
可以为索引的每个列/字段声明一个 操作符表. 操作符表标识将要被该索引用于该列/字段的操作符. 例如, 一个4-字节整数的 B-tree 索引将使用 int4_ops 表; 这个操作符表包括4-字节整数的比较函数. 实际上,该域的数据类型的缺省操作符表一般就足够了. 某些数据类型有操作符表的原因是,它们可能有多于一个的有意义的顺序. 例如,我们对复数类型排序时有可能以绝对值或者以实数部分. 我们可以通过为该数据类型定义两个操作符表,然后在建立索引的时候选择 合适的表来实现.还有些操作符表有特殊的用途:
操作符表 box_ops 和 bigbox_ops 都支持对 box 数据类型的 R-tree 索引. 两者的区别是 bigbox_ops 方形的坐标按比例缩小, 以避免在对非常大的浮点数坐标做乘法,加法和减法时出现浮点例外。 (注意∶这一点在以前是正确的,但是目前这两个操作符表都使用 浮点,因此实际上是相等的.)
下面的查询显示所有已定义的操作符表:
SELECT am.amname AS acc_method, opc.opcname AS ops_name FROM pg_am am, pg_opclass opc WHERE opc.opcamid = am.oid ORDER BY acc_method, ops_name;