索引方法
B-Tree索引
B-tree索引适合比较查询和范围查询,当查询条件使用(>,=,<,>=,<=)时,可以使用B-tree索引。B-tree索引是PostgreSQL和openGauss的默认索引方式。

B-tree索引页分为几种:meta-page、root-page、branch-page和leaf-page,如图-1所示。
meta-page: B-tree索引的元数据页,主要存储B-tree索引的元数据信息,可以通过meta page找到root page信息。
root-page:B-tree的根节点。
branch-page:内部节点,B-tree中根节点和叶子节点外的其他节点。
leaf-page:叶子节点,其中的ctid指向heap tuple,非叶子节点的ctid指向其子节点。
安装pageinspect后,可以通过:
select * from bt_metap(‘tab_pkey’) 查看meta-page 信息
select * from bt_page_stats(‘tab_pkey’,1) 查看索引页信息
select * from bt_page_items(‘tab_pkey’,1) 查看页内tuple信息
index page 结构如图-2所示。
High-Key表示此page的右兄弟节点的最小值,由于page之间数据是有序的,当前page内所有key <= High-Key的值。对unique index而言,当前page内所有key < High-Key的值。
每一层的最右侧节点,由于没有右兄弟节点,因此page内没有High-Key。
Special Space为索引页特有,由于存储每个page左右两边page的页号,可通过Special Space找到左右page。
图-2 B-tree索引页结构
以上是行存引擎的B-tree索引结构,列存的B-tree索引整体结构上与行存相同。leaf-page上行存存储的是key到ctid的映射关系,行存可以直接ctid中的block number及offset找到heap tuple的位置。列存的ctid中记录的是(cu_id, offset),还需要再对应的CUDesc表中根据cu_id列的索引找到对应的CUDesc记录,打开对应的CU文件,根据offset找到数据。
列存上的B-tree索引不支持创建表达式索引、部分索引和唯一索引。
原文链接:https://blog.csdn.net/enmotech/article/details/119362121




