本文介绍PolarDB通用倒排索引GIN(Generalized Inverted Index)。

GIN是一个存储对(key、posting list)集合的索引结构,其中key是一个键值,posting list是一组出现过key的位置。如‘hello', '14:2 23:4'中,表示hello在14:2和23:4这两个位置出现过,这些位置实际上就是元组的tid(行号,包括数据块ID,大小为32 bit;以及item point,大小为16 bit)。通过这种索引结构可以快速的查找到包含指定关键字的元组,因此GIN索引特别适用于多值类型的元素搜索。

应用场景

  • 搜索多值类型,例如数组、全文检索GIN索引应用场景——1
  • 按照任意列进行搜索GIN索引应用场景——2
  • 查找的数据比较稀疏GIN索引应用场景——3

操作符

操作符 示例
<@ select * from test where id <@ array[1,2];
@> select * from test where id @> array[1,2];
= select * from test where id = array[1,2];
&& select * from test where id && array[1,2];

您也可以通过btree_gin插件,支持btree相关的操作符类。

索引结构

GIN索引结构图
  • entry : GIN索引中的一个元素。
  • entry tree : 在entry上构建的B树。
  • posting list : entry物理位置的链表。
  • posting tree : posting list构建的B树。
  • pending list : 索引元组的临时存储链表,用于fastupdate插入。