Postgres 提供了好几种索引类型∶ B-tree,R-tree,和散列.每种索引类型都比较适合某些特定的查询类型, 因为它们用了不同的算法.缺省时, CREATE INDEX 命令将创建一个 B-tree 索引,这也使最常见的情形.特别是在 一个索引了的列涉及到使用下列操作符之一进行比较的时候, Postgres 的查询优化器都会考虑使用 B-tree 索引∶ <, <=, =, >=, >
R-tree 索引特别适合于空间数据.要创建一个 R-tree 索引, 使用下面形式的命令
CREATE INDEX name ON table USING RTREE (column);当一个索引了的列涉及到使用下列操作符之一进行比较的时候, Postgres 的查询优化器都会考虑使用 R-tree 索引∶ <<, &<, &>, >>, @, ~=, && (请参考 Section 4.8 获取这些操作符的含义.)
当一个索引了的列涉及到使用 = 操作符 进行比较的时候,查询优化器会考虑使用散列索引. 下面的命令用于创建散列索引∶
CREATE INDEX name ON table USING HASH (column);
注意: 因为散列索引的应用范围的限制,我们应该优先选用 B-tree 索引. 我们还没有收集到足够的证据表明散列索引实际上表 B-tree 快, 甚至是做 = 比较的时候.而且,散列索引需要 更差劲的锁;参阅 Section 9.7.
B-tree 索引是一个 Lehman-Yao 高并发 B-tree 的实 现。R-tree 索引用 Guttman 的二次分割算法实现了标准的 R-tree。 hash(散列)索引是 Litwin 的线性散列的一个实 现。我们单独的列出这些所用的算法是要表明 所有这些访问模式都是完全动态的并且不必进行周期性的优化(例如,象静 态散列算法常见的那样)。