OceanBase索引构建过程
整体架构
OceanBase的一个集群通常由多个zone组成,一个zone由一个或多个ObServer组成的,每个ObServer都具有计算和存储的功能。在ObServer中有一个较为特殊,负责总控服务的节点称为RootService,负责管理集群的元数据和路由信息,其中,元数据是按照多版本方式管理的。OceanBase按照分区的方式管理数据,一张表包含一个或多个分区,每个分区的数据会存储在多个zone中,每个zone都是一份完整的数据拷贝(副本)。每个分区的副本中会有一个Leader副本,负责处理该分区的读写请求。
存储引擎
OceanBase的存储引擎是按照Log Structured Merge Tree(LSM Tree)方式组织的,分为基线数据和增量数据两部分。基线数据存储在基线SSTable中,增量数据存储在Memtable和转储SSTable中。基线SSTable按照版本递增的方式来管理,某个版本的基线SSTable一旦生成后就变成只读状态,修改的数据会存储在Memtable中,当达到一定内存阈值后会先进行minor compaction(转储)转换成转储SSTable,当转储SSTable达到一定数量时,会将基线SSTable和转储SSTable做major compaction(合并),生成更高版本的基线SSTable。
在SSTable和Memtable中数据都是按照表的主键排序的,例如,有一张数据表test,包含列c1、c2、c3、c4和c5,其中主键为c1,那么test的数据是按照列c1的升序方式存储的;如果在数据表test上创建一个索引index,假设包含列c3和c2,那么index是按照主键c3、c2和c1的升序方式存储的,其中存储c1列是为了方便回表查询。
1. 索引创建
在 OceanBase 中,可以通过 SQL 语句手动创建索引,例如:
2. 后台任务自动构建索引
OceanBase 会自动处理索引的构建过程。当你发出创建索引的命令后,OceanBase 会安排后台任务在不影响前台查询的情况下,逐步构建这个索引。
这通常包括以下几个阶段:
-
预分配空间:在开始构建之前,系统会为新索引预留足够的空间。
-
并行构建:利用多线程或多节点的并行处理能力,OceanBase 可以在多个分区上同时构建索引,以提高效率。
-
增量构建:如果表数据量很大,OceanBase 可以采用增量构建的方式,即先构建一部分数据,然后逐步扩展到全部数据。
3. 索引自动上线
一旦索引构建完成,OceanBase 会自动将这个索引标记为可用状态,无需额外的操作。你可以通过查询系统表或使用以下 SQL 命令来验证索引状态:
SHOW INDEX FROM table_name;
或者查询 INFORMATION_SCHEMA.STATISTICS 表来获取详细信息。

浙公网安备 33010602011771号