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 ] )
令系统检测当索引创建时(如果数据已经存在) 和每次添加数据时表中是否有重复值.如果插入或更新的值 会导致重复的记录时将生成一个错误.
要创建的索引名.
要索引的表名.
用于索引的访问模式.缺省访问模式是 BTREE. Postgres 提供三种用于从索引的访问模式:
一个 Lehman-Yao 高度并发 btrees 的实现.
用 Guttman 分裂法做的标准 rtrees 的实现.
一个Litwin 线性哈希(散列)法的实现.
表的列/字段名.
一个关联的操作符表.参阅下文获取细节。
一个函数,其返回值可被索引.
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-字节整数的比较函数. 实际上,该域的数据类型的缺省操作符表一般就足够了. 某些数据类型有操作符表的原因是,它们可能有多于一个的有意义的顺序. 例如,我们对复数类型排序时有可能以绝对值或者以实数部分. 我们可以通过为该数据类型定义两个操作符表,然后在建立索引的时候选择 合适的表来实现.还有些操作符表有特殊的用途:
操作符表 box_ops 和 bigbox_ops 都支持对 box 数据类型的 rtree 索引. 两者的区别是 bigbox_ops 方形的坐标按比例缩小, 以避免在对非常大的浮点数坐标做乘法,加法和减法时出现浮点例外。 如果你的方形所在 的范围的大小是 20,000 单位的平面或更大,你应该用 bigbox_ops.
下面的查询显示所有已定义的操作符表:
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