Postgresql杂谈 09—Postgresql中的Gist索引的深入学习

本文详细介绍了PostgreSQL中的Gist索引,探讨了其存储结构、在不同类型数据上的应用,如Point和inet,以及与BTree索引的对比。重点展示了Gist索引在空间类型和网络类型查询中的优势。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

       本文,我们进一步学习下Gist索引。Gist是Generalized Search Tree的意思,意思是通用搜索树,底层结构也是一种平衡树,它是一套索引模板,可以支持用户实现自定义的索引。相比于BTree索引,BTree索引可以建立在任意类型之上,但是BTree只支持<、=、>操作符,而Gist索引可以支持@>、&&等复杂运算的操作符。

一、Gist索引的存储结构

       在《Postgresql杂谈 04—Postgresql中的四种常规索引》一文中,笔者曾经简单介绍过Gist索引的使用,并创建过一个包含两个列的索引:

stock_analysis_data=# create index mygistinx on test using gist(fund_code,record_time); 
CREATE INDEX

       test表的结构如下:

stock_analysis_data=# \d+ test
                                                Table "public.test"
   Column    |            Type             | Collation | Nullable | Default | Storage  | Stats target | Description 
-------------+-----------------------------+-----------+----------+---------+----------+--------------+-------------
 fund_code   | character varying(256)      |           |          |         | extended |              | 
 fund_name   | character varying(256)      |           |          |         | extended |              | 
 record_time | timestamp without time zone |           |          |         | plain    |              | 
Indexes:
    "myspgistinx" spgist (fund_code)

       实际上,在我们创建好gist索引之后,整个索引的结构如下:

       可以看到:

(1)只有在叶子节点中保存着数据的otid,上图右边()里面表示数据的otid,逗号左边表示磁盘的页号,右边表示该页中的序号。

(2)树的上层节点具有指向叶子节点的指针,并定义了叶子节点一个Page上数据的范围(对应红色字体部分),但是不含有指向数据的指针。

(3)基于上述的原因,相比于BTree索引,Gist索引所占的空间更大(BTree索引上非叶子节点也包括指向数据的指针)

二、Postgresql中支持Gist索引的操作类

       Postgresql中对一些内置类型已经实现了Gist索引的操作类,我们可以直接使用在这些类型之上使用Gist索引。支持Gist索引的的操作类:

数据类型

索引操作符

box

&& &> &< &<| >> << <<| <@ @> @ |&> !>> ~ ~=

circle

&& &> &<

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值