PostgreSQL 提供了好几种索引类型∶ B-tree,R-tree,GiST 和散列.每种索引类型都比较适合某些特定的查询类型, 因为它们用了不同的算法. 缺省时, CREATE INDEX 命令将创建一个 B-tree 索引,这种索引适合于大多数常见的情形。 B-tree 可以处理那些可以按照某种顺序存储的数据的等于和范围查询。 特别是在一个建立了索引的列涉及到使用下列操作符之一进行比较的时候, PostgreSQL 的查询规划器都会考虑使用 B-tree 索引∶ <, <=, =, >=, >
优化器也会把 B-tree 所以用于涉及模式匹配操作符 LIKE, ILIKE,~,和 ~* 的查询,条件是模式锚接在字串的开头,比如, 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.9 获取这些操作符的含义.)
散列(hash)索引只能处理简单的等于比较。 当一个索引了的列涉及到使用 = 操作符进行比较的时候, 查询规划器会考虑使用散列索引。 下面的命令用于创建散列索引∶
CREATE INDEX name ON table USING HASH (column);
注意: 测试表明 PostgreSQL 的散列索引和 B-tree 索引类似或者慢一些, 而且散列索引的尺寸和制作时间要差很多。而且在高度并发的条件下,散列 索引的性能也很差。因此,目前我们不建议使用散列索引。
B-tree 索引是一个 Lehman-Yao 高并发 B-tree 的实 现。R-tree 索引用 Guttman 的二次分割算法实现了标准的 R-tree。 hash(散列)索引是 Litwin 的线性散列的一个实现。 我们单独的列出这些所用的算法是要表明所有这些索引方法都是完全动态的并且不必进行周期性的优化 (例如,象静态散列算法常见的那样)。