本文介绍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索引特别适用于多值类型的元素搜索。
应用场景
- 搜索多值类型,例如数组、全文检索
- 按照任意列进行搜索
- 查找的数据比较稀疏
操作符
操作符 | 示例 |
---|---|
<@ | 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相关的操作符类。
索引结构
- entry : GIN索引中的一个元素。
- entry tree : 在entry上构建的B树。
- posting list : entry物理位置的链表。
- posting tree : posting list构建的B树。
- pending list : 索引元组的临时存储链表,用于fastupdate插入。