GiST索引

一、GiST索引

  • 是一种平衡的、树状结构的访问方法。它在系统中相当于一个模板,几乎可以实现任意索引模式
  • 可以建立一种可扩展的索引结构,包括数据类型和查询谓词的扩展
  • GiST接口提供了一个高层的抽象,只要求访问方法的实现者实现被访问数据类型的语义,即可快速为新的数据类型开发索引方法

二、GiST索引组织结构

是一颗平衡树,索引项形式为(p, ptr),p是搜索的谓词。在叶子节点中,ptr为指向数据库某元组的指针,在非叶子节点中,ptr为指向子树节点的指针:

 

 

 Gist内置实现了索引项查询、插入和删除的算法。用户通过定义索引项并提供与索引项管理相关的方法,便可实现某一特定的索引结构,这些方法包括:

 

 

 三.Gist索引的实现

1.索引的创建

由函数gistbuild函数完成。创建过程中,索引元组的插入在函数gistdoinsert中完成,实现过程是从根节点开始遍历,找到插入代价最小(由Penalty方法实现)的叶子节点进行插入。若叶子节点已满,插入新索引项会导致叶子节点的分裂,分裂时将调用PickSplit方法来决定新老节点中索引项的布局。向上更新谓词时,会调用Union方法来确定父节点相应索引项的描述谓词:

 

 

2.GiST索引的查询

  • 查询流程与B-Tree索引类似, 从根节点开始按深度优先原则自上而下检索:
  1. 若当前节点R是内部节点,检查R上每个索引项E是否与检索谓词q相符合,对于满足Consistent(E, q)的索引项,递归向下检索以E.ptr为根的子树
  2. 若当前节点R是叶子节点,检查R上每个索引项E是否与检索谓词q相符合,对于满足Consistent(E, q)的索引项,则通过E.ptr取得相应记录与q进行准确匹配。将匹配成功的记录放入结果集
  • 索引查询主要通过gistnext实现,该函数从上往下搜索索引结构。扫描过程中会生成一个栈结构,用于包存扫描过程中满足Consistent方法的节点

 

3、索引的删除

  1. 从叶子节点找到需要删除的索引项
  2. 从叶子节点回溯更新索引
  3. 若删除索引后存在空节点,则删除

四、GiST索引实例

1.数据类型和关键字数据结构

设索引的数据是二维多边形,用最小外接矩形表示。关键字为(Xul, Yul, Xlr, Ylr),其中(Xul, Yul)为外接矩形的左上角,(Xlr, Ylr)为外接矩形的右下角

2.支持的操作(谓词)

Contains(包含), Overlap(重叠), Equil(相等)

 

 3.基于上面的谓词,实现下面的方法

 

 

 

 五、postgresql中支持的创建GiST索引的数据类型

比如box(矩形), polygon(多边形),circle(圆形)等,这些类型可以直接创建Gist索引。其他数据类型如果需要创建Gist索引,需要用户手动添加(将需要的信息编译进数据库)

 

posted @ 2021-06-03 00:17  foreast  阅读(1315)  评论(0编辑  收藏  举报