postgreSQL源码分析——索引的建立与使用——GIST索引(1)

本文深入探讨了GIST(Generalized Search Tree)索引,包括其简介、扩展性和实现细节。GIST是一种自定义数据类型的索引方法,支持对非传统数据如地理信息的高效查询。其接口允许开发人员实现特定于领域的搜索操作,如针对图像的特定条件查询。文章还介绍了GIST的相关数据结构,如GISTSTATE、GISTPageOpaqueData和GIST_SPLITVEC,并强调了其高度的可扩展性。
摘要由CSDN通过智能技术生成

2021SC@SDUSC
这一篇博客主要讲解GIST索引的相关的介绍,组织结构以及原理的讲解。

GIST 简介

介绍

Gist是generalized search tree的缩写,是一棵平衡的搜索树,和之前介绍的btree类似。但是它和btree不同的是,btree索引常常用来进行例如大于、小于、等于这些操作中,而在实际生活中很多数据其实不适用这种场景,例如地理数据、图像等等。因为Gist索引允许定义规则来将任意类型的数据分布到一个平衡的树中,并且允许定义一个方法使用此表示形式来让某些运算符访问。例如,对于空间数据,GiST索引可以使用 R树,以支持相对位置运算符(位于左侧,右侧,包含等),而对于树形图,R树可以支持相交或包含运算符。GiST 的一个优点是它允许一种自定义的数据类型和合适的访问方法一起开发,并且是由该数据类型范畴里的专家,而不是数据库专家开发。

扩展性

通常,实现一种新的索引访问方法意味着大量的艰苦工作。必须理解数据库的内部工作机制,比如锁的机制和预写日志。GiST 接口有一个高层的抽像,只要求访问方法的实现者实现被访问的数据类型的语意。GiST 层本身会处理并发,日志和搜索树结构的任务。

所以,如果你用PostgreSQL B-tree 索引了一个图像集,那么你就只能发出类似"图像 x 和图像 y 相等吗"、“图像 x 是不是比图像 y 小”、“图像 x 是否大于图像 y”?这样的查询。根据你在这个环境下定义的"等于"、“小于”、“大于"的含义,上面这些查询可能有意义。但是,使用一个基于 GiST 的索引,你可以创建一些方法来发出和域相关的问题,比如"找出所有马的图像"或者"找出所有曝光过头的图像”。

实现

GiST自身只是一个框架,针对不同的数据类型和算法逻辑需要额外实现特定的数据语义。由于GiST屏蔽了数据库的内部工作机制,比如锁的机制和预写日志。所以实现新的GiST索引实例(或称作索引操作符类)的工作相对比较轻松,基于GiST架构的索引操作符类只需提供下面7个方法的实现
consistent
给出一个在树的数据页上的谓词 p 和一个用户查询 q ,如果对于一个给定的数据项,p 和 q 都很明确地不能为真,那么这个方法将返回假。
union
这个方法合并树中的信息。给出一个条目的集合,这个函数生成一个新的谓词,这个谓词对所有这些条目都为真。
compress
将数据项转换成一个适合于在一个索引页里面物理存储的格式。
decompress
compress 方法的反方法。把一个数据项的索引表现形式转换成可以由数据库操作的格式。
penalty
返回一个表示将新条目插入树中特定分支需要的"开销"的数值。项将会按照树中最小 penalty 的路径插下去。
picksplit
如果需要分裂一个页面的时候,这个函数决定页面中哪些条目保存呆旧页面里,而哪些移动到新页面里。
same
如果两个条目相同,返回真,否则返回假。

typedef struct GISTSTATE

与实现密切相关的数据结构如下,它是任何GIST索引操作所需要的信息

typedef struct GISTSTATE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值