码迷,mamicode.com
首页 > 其他好文 > 详细

GiST索引

时间:2021-06-03 17:47:31      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:包括   树节点   png   mic   子节点   spl   模式   节点   元组   

一、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索引,需要用户手动添加(将需要的信息编译进数据库)

 

GiST索引

标签:包括   树节点   png   mic   子节点   spl   模式   节点   元组   

原文地址:https://www.cnblogs.com/liuxuelin/p/14843483.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!