Postgresql 提供了好几种索引类型:B-tree,Hash,GiST,GIN 。每种索引类型都比较适合某些特定的查询类型,因为它们用了不同的算法。缺省时,CREATE INDEX 命令将创建一个 B-tree 索引,它适合大多数情况。
B-tree 适合处理那些能够按顺序存储的数据之上的等于和范围查询。特别是在一个建立了索引的字段涉及到使用
< |
<= |
= |
>= |
> |
仅当模式是一个常量,并且锚定在 字符串开头的时候,优化器才会把 B-tree 索引用于模式匹配操作符 LIKE 和 ~ ,比如:col LIKE 'foo%' 或 col ~ '^foo' ,但是 col LIKE '%bar' 就不行。同时,如果你的服务器未使用 C 区域设置,那么你需要用一个特殊的操作符类创建索引来支持模式匹配查询上的索引。 还有可能将 B-tree 索引用于 ILIKE 和 ~* ,但是仅当模式以非字母字符(不受大小写影响的字符)开头才可以。
Hash 索引只能处理简单的等于比较。当一个索引了的列涉及到使用 = 操作符进行比较的时候,查询规划器会考虑使用 Hash 索引。下面的命令用于创建 Hash 索引:
CREATE INDEX name ON table USING hash (column);
【注意】测试表明,Postgresql 的 Hash 索引的性能不比 B-tree 索引强,而 Hash 索引的尺寸和制作时间更差。另外,Hash 索引操作目前没有记录 WAL 日志,因此如果发生了数据库崩溃,我们可能需要用 REINDEX 重建 Hash 索引。因为这些原因,我们并不鼓励使用 Hash 索引。
GiST 索引不是单独一种索引类型,而是一种架构,可以在这种架构上实现很多不同的索引策略。因此,可以使用 GiST 索引的特定操作符类型高度依赖于索引策略(操作符类)。作为示例,Postgresql 的标准发布中包含用于二维几何数据类型的 GiST 操作符类,它支持
<< |
&< |
&> |
>> |
<<| |
&<| |
|&> |
|>> |
@> |
<@ |
~= |
&& |
GIN 索引是反转索引,它可以处理包含多个键的值(比如数组)。与 GiST 类似,GIN 支持用户定义的索引策略,可以使用 GIN 索引的特定操作符类型根据索引策略的不同而不同。作为示例,Postgresql 的标准发布中包含用于一维数组的 GIN 操作符类,它支持
<@ |
@> |
= |
&& |