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.6

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);

注意: 测试表明 PostgreSQL 的散列索引和 B-tree 索引类似或者慢一些, 而且散列索引的尺寸和制作时间要差很多。而且在高度并发的条件下,散列 索引的性能也很差。因此,目前我们不建议使用散列索引。

GiST 索引不是单独一种索引类型,而是一种架构,可以在这种架构上实现很多不同的索引策略。 因此,可以使用 GiST 索引的特定操作符类型根据索引策略的不同而不同(操作符表)。 祥见 Chapter 48

B-tree 索引是一个 Lehman-Yao 高并发 B-tree 的实 现。R-tree 索引用 Guttman 的二次分割算法实现了标准的 R-tree。 hash(散列)索引是 Litwin 的线性散列的一个实现。 我们单独的列出这些所用的算法是要表明所有这些索引方法都是完全动态的并且不必进行周期性的优化 (例如,象静态散列算法常见的那样)。