postgreSQL 索引简介

2,194 阅读3分钟

postgreSQL 索引简介
索引介绍

假设有这样一个表

CREATE TABLE test1 (

id integer,

content varchar

);

发出这样大量的查询:

SELECT content FROM test1 WHERE id = constant;

如果数据很大的时候,数据库会一条一条的查,效率很低

所以我们可以创建一个这样的索引

CREATE INDEX test_id_index ON test1 (id);

索引的名字可以任意


删除索引用:

DROP INDEX 索引名字


在一个很大的表创建索引需要消耗很长时间,postgreSQL允许创建索引的时候查询数据,但是插入,修改,删除的时候必须等到索引创建完后才可以执行。


创建索引后,它必须和表保持同步,这些操作会增加数据库的负荷,因此我们需要删除不用或者不必要的索引。


索引类型

postgreSQL提供了好几种类型,B-tree Hash GiST SP-GiST 和 GIN

在使用create index语句时,会创建B-tree索引,这种索引适用大部分情况。


我们只介绍B-tree和Hash

B-tree适合处理那些能够按照顺序的数据之上的等于和范围查询

<

>

>=

=

<=


Hash索引只能处理比较简单的等于比较,当一个索引列涉及到使用=操作符进行比较的时候,查询规划器会考虑使用Hash索引,创建Hash索引语句:

CREATE INDEX name ON table USING hash (column);


小心:

Hash索引操作目前没有记录WAL日志,因此数据库崩溃后如果有未写入的改变,可能需要用REINDEX重建Hash索引。另外,对hash索引的改变在初始的基础备份后不会被实施基于流或者基于文件的复制,所以对于随后使用它们的查询会给出错误的回复。因此这些原因,所以并不鼓励使用Hash索引。


多字段索引

一个索引可以定义在一个表的多个字段上

CREATE TABLE test2 (

major int,

minor int,

name varchar

);


并且经常这样查询

SELECT name FROM test2 WHERE major = constant AND minor = constant;


那么你可以这样创建索引

CREATE INDEX test2_mm_idx ON test2 (major,minor);


目前只有B-tree GiST 和 GIN支持多字段索引


索引和order by

创建索引时,可以通过包含选项ASC , DESC , NULLS FIRST 和 / 或NULLS LAST调整B-tree索引的顺序


CREATE INDEX test2_info_nulls_low ON test2 (info NULLS FIRST);

CREATE INDEX test3_desc_index ON test3 (id DESC NULLS LAST);



组合多个索引

假设在(a,b)上创建一个索引,那么类似where a = 5 and b = 4的条件可以使用索引的,但是where a = 5 or b = 10的条件不能直接使用索引


如果在查询的时候,涉及到x,有时涉及到y,有时涉及到x,y,这种情况就可以在x和y上创建两个独立的索引


唯一索引

索引还可以用于强迫字段数值的唯一性,或者是多个字段组合值的唯一性

CREATE UNIQUE INDEX name ON table (column [,...]);

目前,只有B-tree索引可以声明为唯一


如果索引声明为唯一的,那么就不允许出现多个索引值相同的行,null被认为互不相等,一个多字段唯一索引只在多行数据里所有被索引字段都相等时才拒绝


如果一个声明了唯一约束或者主键,那么postgreSQL自动在组成主键或唯一约束的字段上创建唯一索引(可能是多字段索引),以强制执行这些约束


注意:

给表增加唯一约束比较好的办法是ALTER TABLE ... ADD CONSTRAINT.用索引强制执行唯一约束应该认为是一个实现细节,而不应该直接访问。不过,我们应该知道没有必要再唯一字段上建立索引,那样做只会和自动创建的索引重复。