11.2. 索引类型

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

B-tree 可以处理那些可以按照某种顺序存储的数据的等于和范围查询。 特别是在一个建立了索引的列涉及到使用下列操作符之一进行比较的时候, PostgreSQL 的查询规划器都会考虑使用 B-tree 索引∶

<
<=
=
>=
>

构造等效于这些操作符的组合,比如 BETWEENIN, 也可以用 B-tree 索引搜索视线。(但是要注意,IS NULL 不等于 =, 并且是不能建立索引的。)

优化器也会把 B-tree 所以用于涉及模式匹配操作符 LIKEILIKE~,和 ~* 的查询,条件是模式是一个常量,并且锚接在字串的开头,比如, col LIKE 'foo%' 或者 col ~ '^foo', 而不是 col LIKE '%bar'。 但是,如果你的服务器不适用 C 区域,那么你需要用一个特殊的操作符表创建索引来支持模式匹配查询上的索引。 参阅下面的 Section 11.8

R-tree 索引特别适合于两维空间数据。要创建一个 R-tree 索引, 使用下面形式的命令

CREATE INDEX name ON table USING rtree (column);

当一个索引了的列涉及到使用下列操作符之一进行比较的时候, PostgreSQL 的查询规划器都会考虑使用 R-tree 索引∶

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

(请参考 Section 9.10 获取这些操作符的含义。)

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

CREATE INDEX name ON table USING hash (column);

GiST 索引不是单独一种索引类型,而是一种架构,可以在这种架构上实现很多不同的索引策略。 因此,可以使用 GiST 索引的特定操作符类型根据索引策略的不同而不同(操作符表)。 标准的 PostgreSQL 包含等效于 R-tree 的 GiST 操作符表, 另外还有很多其它 GiST 操作符表在 contrib 里以独立的项目的形式存在。 详见 Chapter 49

注意: 测试表明,PostgreSQL 的散列索引的性能不比 B-tree 索引强, 而散列索引的尺寸和制作时间更差。另外,散列索引操作目前没有记录 WAL 日志, 因此如果发生了数据库崩溃,我们可能需要用 REINDEX 重建散列索引。 因为这些原因,我们并不鼓励使用散列索引。

类似的,R-tree 索引看上去并不比等效的 GiST 索引操作性能更好。 和散列索引一样,它们也是没有记录 WAL 日志的,因此可能在数据库崩溃之后需要重建。

虽然散列索引的问题将来可能会得到改正,但是 R-tree 索引类型看上去很有可能在将来的版本里退休。 我们鼓励使用 R-tree 索引的用户将自己的应用移植到使用 GiST 索引上。