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索引,需要用户手动添加(将需要的信息编译进数据库)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构