CREATE INDEX -- 定义一个新索引
Synopsis
CREATE [ UNIQUE ] INDEX name ON table [ USING method ] ( { column | ( expression ) } [ opclass ] [, ...] ) [ TABLESPACE tablespace ] [ WHERE predicate ]
描述
CREATE INDEX 在指定的表上构造一个名为 index_name 的索引。索引主要用来提高数据库性能。但是如果不恰当的使用将导致性能的下降。
索引的键字字段是以字段名的方式声明的,或者是可选的写在一个圆括弧里面的表达式。 如果索引方式支持多个字段索引,那么我们也可以声明多个字段。
一个索引字段可以是一个使用表的行的一个或多个字段的数值进行计算的表达式。 整个特性可用于获取对基本数据某种变形的快速访问。 比如,一个在 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 强制一个表的某个子集的唯一性。 参阅 Section 11.7 探讨更多信息。
在 WHERE 子句里用的表达式只能引用下层表的字段,但是它可以使用所有字段,而不仅仅是被索引的字段。 目前,子查询和聚集表达式也不能出现在WHERE里。
索引定义里的所有函数和操作符都必须是immutable,(不变的)也就是说, 它们的结果必须只能依赖于它们的输入参数,而决不能依赖任何外部的影响(比如另外一个表的内容或者当前时间)。 这个约束确保该索引的行为是定义完整的。要在一个索引上使用用户定义函数,请记住在你创建它的时候把它标记为immutable的函数。
参数
-
UNIQUE
-
令系统检测当索引创建时(如果数据已经存在)和每次添加数据时表中是否有重复值。 如果插入或更新的值会导致重复的记录时将生成一个错误。
name
-
要创建的索引名。这里不能包含模式名; 索引总是在同一个模式中作为其父表创建的。
table
-
要索引的表名(可能有模式修饰)。
method
-
用于索引的方法的名字。可选的名字是 btree, hash,rtree,和 gist。缺省方法是 btree。
column
-
表的列/字段名。
expression
-
一个基于该表的一个或多个字段的表达式。 这个表达式通常必须带着圆括弧包围写出,如语法中显示那样。 不过,如果表达式有函数调用的形式,那么圆括弧可以省略。
opclass
-
一个关联的操作符表。参阅下文获取细节。
tablespace
-
创建索引所在的表空间。如果没有声明,则使用 default_tablespace 的表空间, 如果 default_tablespace 是空字串,则使用数据库的缺省表空间。
predicate
-
为一个部分索引定义约束表达式。
注意
参阅 Chapter 11 获取有关何时使用索引,何时不使用索引, 以及它们哪种情况下是有用的信息。
目前,只有 B-tree 和 gist 索引方法支持多字段索引。 缺省时最多可以声明 32 个键字(这个限制可以在制作 PostgreSQL 时修改)。 目前只有 B-tree 支持唯一索引。
可以为索引的每个列/字段声明一个 操作符表。 操作符表标识将要被该索引用于该列/字段的操作符。 例如, 一个四字节整数的 B-tree 索引将使用 int4_ops 表; 这个操作符表包括四字节整数的比较函数。 实际上,该域的数据类型的缺省操作符表一般就足够了。 某些数据类型有操作符表的原因是,它们可能有多于一个的有意义的顺序。 例如,我们对复数类型排序时有可能以绝对值或者以实部。 我们可以通过为该数据类型定义两个操作符表,然后在建立索引的时候选择合适的表来实现。 有关操作符表更多的信息在 Section 11.8 和 Section 32.14 里。
使用 DROP INDEX 删除一个索引。
缺省时索引不会用于 IS NULL 子句。这种场合下使用索引的最好方法是用 IS NULL 谓词创建一个部分索引。
例子
在表films上的 title字段创建一个 B-tree 索引:
CREATE UNIQUE INDEX title_idx ON films (title);
在表 films 的字段 code 上创建一个索引, 并且让索引存在于表空间 indexspace上:
CREATE INDEX code_idx ON films(code) TABLESPACE indexspace;
兼容性
CREATE INDEX 是 PostgreSQL 语言扩展。 在 SQL92 中没有 CREATE INDEX 命令。
================================================
给oracle数据表建立索引
按照一般的说法,一个数据表如果数据量超过了几百条,就要考虑建立索引了。拖了这么久,今天终于给我们的一些变大了的数据表建立了索引。
首先,查看目前已经建立的索引
select index_name from all_indexes where table_name = 'PICTURE';
果然比较弱智,只有系统给主键自建的索引:SYS_C55001
还犯了一个错误,一般情况下,oracle是不管大小写的,但上面查询语句里面的table_name必须大写,如果写成'picture'则是没有记录。
接着,建立索引。
create index picture_album_idx on picture (aid);
create index picture_user_idx on picture (userid);
create index picture_cat_idx on picture (cid);
第三,再重复第一步,验证一下,是否成功。
第四, 感觉一下,浏览相册时,速度是否快了一点。
因为理论上是应该快一点。
-----------------------
eg:
select index_name from all_indexes where table_name = 'TB_PUT_APPROVE';
select * from TB_PUT_APPROVE t
create index TB_PUT_APPROVE_approveid on TB_PUT_APPROVE(approveid)