postgresql索引介绍【转】

原文:http://www.cnblogs.com/daduxiong/archive/2010/08/17/1801588.html

创建索引通常能够提高数据库的性能,使查询速度大幅提高。同时索引的存在也为数据库中的数据维护带来的负面影响,增加的数据库与系统的资源消耗。

适当的建立索引总能利大于弊。
postgresql数据库中可以创建多字段、唯一、函数、部分索引多种类型的索引。可能基于主要面向OLTP系统的应用没有引入位图索引(个人猜测)。

测试表:

CREATE TABLE test1 (
  id integer,
  content varchar
  );

 

查询语句:

SELECT content FROM test1 WHERE id = constant;

 

在没有索引的情况下,数据库需要一行行的对表test1进行扫描,test1含有多少数据块就需要扫描多少数据块,对于想要获取非常少量数据的情况下,大量的IO开销显的非常重要,对系统会带来严重的影响。通过创建索引,大大减少了数据库的扫描块数,减少了数据匹配的验证次数,更少更快的扫描路径,提高查询的性能。同样能够提高带有查询语句的delete、update操作的性能。
创建索引:

CREATE INDEX test1_id_index ON test1 (id);

 

删除索引:

DROP INDEX test1_id_index;

 

 

并行创建:
索引创建时需要与表数据保持同步,执行创建语句时系统需要对表进行锁定,期间将会对表的delete、update、insert事务进行阻塞。在生产系统中创建索引需要注意创建的时间,如果对大数据量的表创建索引时,更应该选在系统空闲时。
为了加快索引的创建速度postgresql引入了CONCURRENTLY选项,对索引进行并发创建。CONCURRENTLY选项能够使系统在不阻塞write操作的情况下执行索引创建。其实质是执行两次的表扫描,尽管解决了write的问题,但是需要更多的IO和CPU开销。

以下是CREATE INDEX语法:

复制代码
代码
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] name ON table [ USING method ]
( { column
| ( expression ) } [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
[ WITH ( storage_parameter
= value [, ... ] ) ]
[ TABLESPACE tablespace ]
[ WHERE predicate ]
复制代码

 

posted @ 2012-11-06 12:10  Leo Forest  阅读(182)  评论(0编辑  收藏  举报