本文,我们进一步学习下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 |
&& &> &< |

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

被折叠的 条评论
为什么被折叠?



