openGauss源码解析(60)

openGauss源码解析:存储引擎源码解析(28)

4.3.3 内存表的存储

Table类包含管理数据库中内存表所需的所有项。表由以下组件组成:列、主索引和可选的二级索引。关键成员变量说明如表4‑36 Table类的关键成员变量所示。

表4‑36 Table类的关键成员变量

成员变量

描述

tableCounter : std::atomic<uint32_t>

原子表ID

m_tupleSize : uint32_t

原始元组大小(以字节为单位)

m_tableExId : uint64_t

openGauss提供的外部表ID

m_secondaryIndexes : SecondaryIndexMap

按名称访问的二级索引映射

m_rwLock : pthread_rwlock_t

RW Lock,防止在检查点/真空期间删除

m_rowPool : ObjAllocInterface*

row_pool行分配器对象池

m_primaryIndex : MOT::Index*

主索引

m_numIndexes : uint16_t

正在使用的耳机索引数

m_indexes : MOT::Index**

索引数组

m_fixedLengthRows : bool

指定行是否具有固定长度

m_fieldCnt : uint32_t

表schema中的字段个数

m_columns : Column**

列数组

Row类包含管理表中的内存行所需的所有项,关键成员变量如表4-37所示。

表4‑37 Row类的关键成员变量

成员变量

描述

m_data : uint8_t

保存行数据的原始缓冲区,开始于类的结束位置

m_keyType : KeyType

使用的键类型。

  • Internal –用于内部测试(64位)
  • Surrogate –用于无索引表
  • External –需要从行生成

m_pSentinel : Sentinel*

指向主哨兵的指针

m_rowHeader : RowHeader

OCC行的头部,包含OCC操作的所有相关信息

m_rowId : uint64_t

创建行时生成的唯一rowId

m_table : Table*

指向内存管理表的指针

4.4.4 索引

MOT使用索引来高效地访问数据。MOT索引支持范围查询等所有基本操作。由于数据存储在Row类中,每个MOT索引都按顺序使用哨兵来访问数据。

IndexFactory类提供了创建新索引对象的能力。

作为Table类的一部分,Index抽象类提供了创建和访问数据索引的能力。索引是否满足唯一性决定了该索引是否允许插入重复键。如图4-54所示,描述了一个有三行和两个索引的MOT表T的结构,其中一个索引是非唯一索引,另一个索引是唯一索引。对于非唯一索引而言,MOT内部通过在插入时用唯一标识符填充每个键的方式将键视为唯一。在图4-54中,MOT将哨兵插入到带有键的唯一索引和带有键+后缀的非唯一索引中。使用哨兵方便了维护操作,因为在进行维护操作时,可以在不接触索引数据结构的情况下替换行。

C:\Users\w00252320\Documents\源代码解析\非唯一索引.png

图4‑54 唯一、非唯一索引和哨兵

Sentinel类包含指向唯一索引情况下的行数据或非唯一索引情况下主哨兵的指针,还包含一些标志位和引用计数等支持跨事务并发的信息。每次向索引插入新键时都会创建哨兵。例如,对于具有3个索引的表,插入新键时将创建3个哨兵,每个索引对应一个哨兵。哨兵和行之间的关系如图0‑所示。

图4‑55 哨兵与行关系

MasstreePrimaryIndex类实现了索引接口。它基于Masstree K/V存储实现,同时封装了MOT内存分配池,根据对象分配任意大小内存。

IndexIterator抽象类提供了创建迭代器并根据提供的迭代器访问数据的能力。

posted @ 2024-04-29 16:52  openGauss-bot  阅读(7)  评论(0编辑  收藏  举报