11.2. 索引类型

PostgreSQL提供了好几种索引类型:B-tree, Hash, GiST, GIN 。每种索引类型都比较适合某些特定的查询类型,因为它们用了不同的算法。 缺省时,CREATE INDEX命令将创建一个B-tree索引,它适合大多数情况。

B-tree索引适合处理那些能够按顺序存储的数据之上的等于和范围查询。特别是在一个建立了索引的字段涉及到使用:

<
<=
=
>=
>

操作符之一进行比较的时候,PostgreSQL的查询规划器都会考虑使用B-tree索引。 等效于这些操作符组合的构造,比如BETWEENIN可以用B-tree索引实现。同时,索引列上的IS NULL或者IS NOT NULL条件也可以用B-tree索引实现。

仅当模式是一个常量,并且锚定在字符串开头的时候,优化器才会把B-tree索引用于模式匹配操作符LIKE~, 比如:col LIKE 'foo%'col ~ '^foo' ,但是 col LIKE '%bar'就不行。同时,如果你的服务器未使用C区域设置, 那么你需要用一个特殊的操作符类创建索引来支持模式匹配查询上的索引。参阅Section 11.9。还有可能将B-tree索引用于ILIKE~*, 但是仅当模式以非字母字符(不受大小写影响的字符)开头才可以。

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

   
CREATE INDEX name ON table USING hash (column);

Caution

Hash索引操作目前没有记录WAL日志,因此如果发生了数据库崩溃,我们可能需要用REINDEX重建Hash索引。 他们也不会通过流或基于文件复制而被复制。

GiST索引不是单独一种索引类型,而是一种架构,可以在这种架构上实现很多不同的索引策略。 因此,可以使用GiST索引的特定操作符类型高度依赖于索引策略(操作符类)。 作为示例,PostgreSQL的标准发布中包含用于二维几何数据类型的 GiST 操作符类,它支持:

<<
&<
&>
>>
<<|
&<|
|&>
|>>
@>
<@
~=
&&

这些操作符的含义参见Section 9.11。许多其它GiST操作符类位于contrib中,或者是单独的项目,更多信息参见Chapter 52

GIN索引是反转索引,它可以处理包含多个键的值(比如数组)。 与GiST类似,GIN支持用户定义的索引策略,可以使用GIN索引的特定操作符类型根据索引策略的不同而不同。 作为示例,PostgreSQL的标准发布中包含用于一维数组的GIN操作符类,它支持:

<@
@>
=
&&

这些操作符的含义参见Section 9.17。 许多其它GIN操作符类位于contrib中,或者是单独的项目,更多信息参见Chapter 53