PostgreSQL支持多种类型的索引
索引类型
B-tree索引
B-Tree是一种常见的平衡树数据结构,用于实现关联数组(即支持快速查找、插入和删除的数据结构)。B-Tree的主要应用之一是在数据库管理系统中实现索引。PostgreSQL 默认使用 B-tree 索引类型。它适用于大多情况。
B-Tree是一种多路搜索树,它的每个节点可以包含多个关键字和指向子节点的指针。B-Tree节点中的关键字按照升序排列,这样可以方便地进行二分查找。
图片来自www.scaler.com/topics/b-tr…
B-Tree和B+Tree很像,有时会引起混淆。
- 在这两种tree中,MySQL的InnoDB索引使用的是B+Tree。而Postgres 索引使用的是B-Tree。
- B+tree只在叶子节点上储存数据。B-Tree的内部节点和叶子节点都能储存数据。
哈希索引
这种索引的实现原理是,储存被索引列的值的32-bit hash code。它只能用于相等比较的情形。
GiST
全称为Generalized Search Tree。它是一种通用的搜索树,支持多种数据类型和多种查询方式。可用于处理多种数据类型,如点、线、圆、多边形等空间数据类型以及全文搜索、图像搜索等非空间数据类型。PostGIS就用到了它。
SP-GiST
SP-GiST全称为Space-Partitioned Generalized Search Tree,它是GiST索引的一种变种,相比于GiST索引具有更高的查询性能和更低的构建成本。
GIN
GIN全称为Generalized Inverted Index,它是一种基于倒排索引的全文索引,适用于对文本或数组等复杂数据类型进行高效的全文搜索。 GIN索引类型的设计是为了处理可细分的数据类型,并且你希望搜索单个组件值(例如数组元素、文本文档中的词汇等)。
BRIN
BRIN索引是一种基于块范围的索引,适用于对大型表中的有序数据进行高效的范围查询。
特性
这里介绍一下postgres index的一些feature
多列索引
一个索引可以定义在多个列上。
表达式索引
如果你要获取的值,是通过多个列的值计算得到的,而且需要快速获取计算结果,可以考虑使用这种索引。一个例子
SELECT * FROM people WHERE (first_name || ' ' || last_name) = 'John Smith';
可以使用这种方法来建立索引
CREATE INDEX people_names ON people ((first_name || ' ' || last_name));
注意,索引表达式不会在索引搜索时重新计算,因为它们已保存在index里了。
部分索引
部分索引是创建在一张表的子集上的索引。 使用这种索引的一个原因是,避免索引常见的值。不索引这些值可以降低索引的大小,而且提升修改操作的速度。