OceanBase 数据库的存储引擎和传统数据库有什么不一样的地方?

OceanBase 数据库采用了一种读写分离的架构,把数据分为基线数据和增量数据。其中增量数据放在内存里(MemTable),基线数据放在 SSD 盘(SSTable)。对数据的修改都是增量数据,只写内存。所以 DML 是完全的内存操作,性能非常高。读的时候,数据可能会在内存里有更新过的版本,在持久化存储里有基线版本,需要把两个版本进行合并,获得一个最新版本。同时在内存实现了 Block Cache 和 Row Cache,来避免对基线数据的随机读。当内存的增量数据达到一定规模的时候,会触发增量数据和基线数据的合并,把增量数据落盘。同时每天晚上的空闲时刻,系统也会自动每日合并。

数据在 OceanBase 数据库中是如何存储的?

OceanBase 数据库的数据文件以宏块(Macro Block)为单位组织数据,每个宏块大小为 2 MB。宏块内部又划分出很多个16 KB(压缩前的大小)大小的微块(Micro Block),而每个微块里面包含多个行(Row)。OceanBase 数据库内部 IO 的最小单位是微块。

应该使用分区表吗?

是否使用分区表,可以参考以下信息进行判断:

  • 如果一张表的数据量在可预期的未来会突破 200 GB,建议使用分区表。

  • 如果表具有比较明显的时间周期,建议使用分区表。

在 OceanBase 数据库中,局部索引与全局索引在实现上的区别是什么?

局部索引与全局索引的区别如下:

  • 局部索引:和单表或者分区表最小子分区绑定在一起,不会在 OceanBase 数据库系统租户中创建额外的分区记录,所有基于局部索引的 SQL 基本都是本地执行。

  • 全局索引:需要在 OceanBase 数据库系统租户中创建额外的一个分区记录,可以理解为另外一张表,占用额外的分区配额。全局索引可以有自己的分区策略,Locaility 也不与主表绑在一起,即使是单表,全局索引也可以与主表分别存储在不同的节点上,当然这样也更容易使 SQL 成为分布式 SQL。