在 OceanBase 数据库的存储视角看,存储结构里最上层是 Partition Group,对应一个分区组,很多时候我们也将其简称为 PG。PG 是一个为了取得极限性能而抽象出来的一个概念。我们知道在一个用户的事务中,可能会操作很多张不同的表,在 OceanBase 数据库的分布式架构下,很难保证这些不同的表在相同的服务器上,那么这就势必会带来分布式事务,而分布式事务是依赖两阶段提交的,会有更大的开销;如果这些不同的表都在相同的服务器上,我们就有可能对这个事务做一阶段优化,以取得更好的性能。但大多数情况下,对表的位置其实是没有办法保证的。对于互联网下的很多应用,我们发现业务都会根据 User Id 做表的分区,并且多张表的分区规则都是相同的,对于这些表我们提供了语法来构建 Table Group,对于 Table Group 中的相应分区我们称之为 Partition Group,OceanBase 数据库会保证同一个 Partition Group 中的多个 Partition 始终绑定在一起,那么对于同一个 Partition Group 的事务操作就会被优化为单机事务,以取得更好的性能。
在一个 Partition Group 中可能包含多个 Partition,注意这些 Partition 的分区键和分区规则要完全相同。Partition Group 是 OceanBase 数据库的 Leader 选举和迁移复制的最小单位。Partition 就是表的一个分区,和 Oracle/MySQL 对于分区的定义基本相同。表的分区规则可能有很多种,例如 Hash 分区、Range 分区、List 分区甚至二级分区等等,但对于存储层来说,并不关心以上分区规则,都一视同仁为 Partition。
在 OceanBase 数据库中, 对于用户表支持创建局部索引,局部索引的特征就是在存储上会和主表绑定在同一个 partition 内部存储,主表和每个索引在内部会存储在各自独立的Table Store 内,在每一个Table Store 中会包含多个 SSTable 和 MEMTable。MEMTable 存储于内存,存储动态数据,提供读写操作;SSTable 存储于磁盘,存储静态数据并且只读。