openGauss源码解析(60)
openGauss源码解析:存储引擎源码解析(28)
4.3.3 内存表的存储
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所示。
成员变量 | 描述 |
m_data : uint8_t | 保存行数据的原始缓冲区,开始于类的结束位置 |
m_keyType : KeyType | 使用的键类型。
|
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将哨兵插入到带有键的唯一索引和带有键+后缀的非唯一索引中。使用哨兵方便了维护操作,因为在进行维护操作时,可以在不接触索引数据结构的情况下替换行。
Sentinel类包含指向唯一索引情况下的行数据或非唯一索引情况下主哨兵的指针,还包含一些标志位和引用计数等支持跨事务并发的信息。每次向索引插入新键时都会创建哨兵。例如,对于具有3个索引的表,插入新键时将创建3个哨兵,每个索引对应一个哨兵。哨兵和行之间的关系如图0‑所示。
MasstreePrimaryIndex类实现了索引接口。它基于Masstree K/V存储实现,同时封装了MOT内存分配池,根据对象分配任意大小内存。
IndexIterator抽象类提供了创建迭代器并根据提供的迭代器访问数据的能力。