前言
上一篇讲了索引的重要性,接下来我们谈谈索引类型。
索引类型
索引本质上也是一种数据结构,使用什么样的数据结构,取决于我们要索引的数据特点。根据数据特点合理地使用合适的索引类型,才能最大作用的发挥索引的作用。
B-Tree
B-Tree是平衡排序树。正是其有序的特点,使得它在等值查找,范围查找:大于、等于、小于,这类大多数业务场景的需求下,使用特别广泛,以至于很多数据库默认都是使用B-Tree或者其变种类型作为数据库的默认索引类型。
PG8.3及以后的版本开始支持在索引上查找(或避免)NULL值。
文本操作符类
对于文本域上的索引(B-Tree)是可以加速查找子串的。但只能支持前向匹配,即形如:like ‘start%’。
对于需要区域相关的逐字符比较的场景,则可以用如下特殊模式创建索引:
-- text_pattern_ops 代表字符操作函数
CREATE INDEX idx_xxx ON table (string_field text_pattern_ops)
Hash
只支持等值匹配,且不允许NULL值。
维护成本高。当数据库发生崩溃时,Hash索引容易损坏,由此导致查询效率降低。这时需要重建碎银才能解决。因此,一般不推荐使用。
GIN-倒排索引
倒排索引是全文检索的利器,通常在搜索引擎中看到它的身影,例如ES。这算是PG与其他数据库的一大特点了。
高阶索引索引(过段时间在研究-没懂)
GiST
通过搜索树(GiST)提供了一种用于存储数据的方式来构建平衡的树结构,只需要定义如何对待键即可。需要自定义聚集算法
SP-GiST
是space-partitioned GiST(空间划分GiST)的缩写。支持划分搜索树,这种树可以用来开放范围广泛的非平衡数据结构,例如:四叉树、k-d树和后缀树(字典树)。这些结构的共同特征是他们会反复把搜索空间划分成尺寸不相等的分区。
BRIN
BRIN是一种新索引,它代表块范围索引。所谓块范围是指表中相邻页面的范围。对于每个块范围,索引至少会存储该范围的最小信息。在9.x实现中,索引存储了每个块的最小和最大值。通常用于非常大的表。
沒有B-Tree或其他传统索引的维护开销。他们通过维护有关表范围的‘摘要’数据来工作。位图索引扫描会读取每个摘要元组,并且把他们与查询条件进行比较。如果条件和摘要元组中的值一致,则用一个有损的TID位图返回所有位于范围内的页面。否则不返回。
BRIN不支持不同索引扫描,原因是他们不存储TID。
位图索引
组织形式与B-Tree相同。而B-Tree只要索引列不为空就会在索引的叶子节点进行存储。但是位图索引只能适用于只有少数固定值的列。
总结
学习之路漫漫,吾将上下而求索。下一篇就是索引的使用了,加油!
PS:摘抄自《PostgreSQL 9X之巅》
图来自PostgreSQL独门绝招之一 GIN , GiST , SP-GiST , RUM 索引原理与技术背景