存储引擎源码解析 | 磁盘引擎(11)

4.2.5 行存储索引机制

本节以B-Tree索引为例,介绍openGauss中行存储(格式)表的索引机制。索引本质上是对数据的一种物理有序聚簇。有序聚簇参考的排序字段被称为索引键。为了节省存储空间,一般索引表中只存储有序聚簇的索引键键值以及对应元组在主表中的物理位置。在查询指定的索引键键值元组时,得益于有序聚簇排序,可以快速找到目标元组在主表中的物理位置,然后通过访问主表对应页面和偏移得到目标元组。B-Tree索引的组织结构如图4-19所示。

当前openGauss版本中,每个B-Tree的页面采用和行存储astore堆表页面基本相同的页面结构(见“4.2.3 astore”节的“2. astore堆表页面元组结构”小节)。页面间按照树形结构组织,分为根节点页面、内部节点页面和叶子节点页面。其中,根节点页面和内部节点页面中的索引元组不直接指向堆表元组,而是指向下一层的内部节点页面或叶子节点页面;叶子节点页面位于B-Tree的最底层,叶子节点页面中的索引元组指向索引键值对应的堆表元组,即存储了该元组在堆表中的物理位置(堆表页面号和页内偏移)。
B-Tree索引元组结构由索引元组头、NULL值字典和索引键值字段3分组成。
索引元组头为IndexTupleData结构体,定义代码如下所示。其中,t_tid为堆表元组的位置或下一层索引页面的位置;t_info为标志位,记录键值中是否有NULL值、是否有变长键值、索引访存方式信息以及元组长度。

ItemPointerData t_tid; /* 堆表元组的物理行号 */ /* --------------- * t_info标志位内容: * * 第15位:是否有NULL字段 * 第14位:是否有变长字段 * 第13位: 访存方式自定义 * 第0-12位: 元组长度 * --------------- */ unsigned short t_info; /* 如上 */ } IndexTupleData; /* 实际索引元组数据紧跟该结构体 */