GiST索引
Posted liuxuelin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GiST索引相关的知识,希望对你有一定的参考价值。
一、GiST索引
- 是一种平衡的、树状结构的访问方法。它在系统中相当于一个模板,几乎可以实现任意索引模式
- 可以建立一种可扩展的索引结构,包括数据类型和查询谓词的扩展
- GiST接口提供了一个高层的抽象,只要求访问方法的实现者实现被访问数据类型的语义,即可快速为新的数据类型开发索引方法
二、GiST索引组织结构
是一颗平衡树,索引项形式为(p, ptr),p是搜索的谓词。在叶子节点中,ptr为指向数据库某元组的指针,在非叶子节点中,ptr为指向子树节点的指针:
Gist内置实现了索引项查询、插入和删除的算法。用户通过定义索引项并提供与索引项管理相关的方法,便可实现某一特定的索引结构,这些方法包括:
三.Gist索引的实现
1.索引的创建
由函数gistbuild函数完成。创建过程中,索引元组的插入在函数gistdoinsert中完成,实现过程是从根节点开始遍历,找到插入代价最小(由Penalty方法实现)的叶子节点进行插入。若叶子节点已满,插入新索引项会导致叶子节点的分裂,分裂时将调用PickSplit方法来决定新老节点中索引项的布局。向上更新谓词时,会调用Union方法来确定父节点相应索引项的描述谓词:
2.GiST索引的查询
- 查询流程与B-Tree索引类似, 从根节点开始按深度优先原则自上而下检索:
- 若当前节点R是内部节点,检查R上每个索引项E是否与检索谓词q相符合,对于满足Consistent(E, q)的索引项,递归向下检索以E.ptr为根的子树
- 若当前节点R是叶子节点,检查R上每个索引项E是否与检索谓词q相符合,对于满足Consistent(E, q)的索引项,则通过E.ptr取得相应记录与q进行准确匹配。将匹配成功的记录放入结果集
- 索引查询主要通过gistnext实现,该函数从上往下搜索索引结构。扫描过程中会生成一个栈结构,用于包存扫描过程中满足Consistent方法的节点
3、索引的删除
- 从叶子节点找到需要删除的索引项
- 从叶子节点回溯更新索引
- 若删除索引后存在空节点,则删除
四、GiST索引实例
1.数据类型和关键字数据结构
设索引的数据是二维多边形,用最小外接矩形表示。关键字为(Xul, Yul, Xlr, Ylr),其中(Xul, Yul)为外接矩形的左上角,(Xlr, Ylr)为外接矩形的右下角
2.支持的操作(谓词)
Contains(包含), Overlap(重叠), Equil(相等)
3.基于上面的谓词,实现下面的方法
五、postgresql中支持的创建GiST索引的数据类型
比如box(矩形), polygon(多边形),circle(圆形)等,这些类型可以直接创建Gist索引。其他数据类型如果需要创建Gist索引,需要用户手动添加(将需要的信息编译进数据库)
以上是关于GiST索引的主要内容,如果未能解决你的问题,请参考以下文章
Postgres ltree 不使用 Gist 索引 为啥?
PostgreSQL GIN 索引比 pg_trgm 的 GIST 慢?