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 语句手动创建索引,例如:

CREATE INDEX index_name ON table_name(column_name);

2. 后台任务自动构建索引

OceanBase 会自动处理索引的构建过程。当你发出创建索引的命令后,OceanBase 会安排后台任务在不影响前台查询的情况下,逐步构建这个索引。

这通常包括以下几个阶段:

  • 预分配空间:在开始构建之前,系统会为新索引预留足够的空间。

  • 并行构建:利用多线程或多节点的并行处理能力,OceanBase 可以在多个分区上同时构建索引,以提高效率。

  • 增量构建:如果表数据量很大,OceanBase 可以采用增量构建的方式,即先构建一部分数据,然后逐步扩展到全部数据。

3. 索引自动上线

一旦索引构建完成,OceanBase 会自动将这个索引标记为可用状态,无需额外的操作。你可以通过查询系统表或使用以下 SQL 命令来验证索引状态:

SHOW INDEX FROM table_name;

或者查询 INFORMATION_SCHEMA.STATISTICS 表来获取详细信息。

 

posted @ 2025-07-15 20:51  使用D  阅读(27)  评论(0)    收藏  举报