表分片
表分片是一种将大表分成多个小表的技术。 这种做法通常用于提高数据库系统的性能。
在 GreptimeDB 中,数据从逻辑上被分片成多个分区。 由于 GreptimeDB 使用“表”来分组数据并使用 SQL 来查询数据, 因此采用了 OLTP 数据库中常用的术语“分区”。
表分片的时机
在 GreptimeDB 中,数据管理和调度都是基于 region 级别的, 每个 region 对应一个表分区。 因此,当你的表太大而无法放入单个节点, 或者表太热而无法由单个节点提供服务时, 应该考虑进行分片。
GreptimeDB 中的一个 region 具有相对固定的吞吐量, 表中的 region 数量决定了表的总吞吐量容量。 如果你想增加表的吞吐量容量, 可以增加表中的 region 数量。 理想情况下,表的整体吞吐量应与 region 的数量成正比。
至于使用哪个特定的分区列或创建多少个 region, 这取决于数据分布和查询模式。 一个常见的目标是使数据在 region 之间的分布尽可能均匀。 在设计分区规则集时应考虑查询模式, 因为一个查询可以在 region 之间并行处理。 换句话说,查询延迟取决于“最慢”的 region 延迟。
请注意,region 数量的增加会带来一些基本的消耗并增加系统的复杂性。 你需要考虑数据写入速率的要求、查询性能、存储系统上的数据分布。 只有在必要时才应进行表分片。
有关分区和 region 之间关系的更多信息,请参阅贡献者指南中的表分片部分。
分区
在 GreptimeDB 中, 表可以通过多种方式进行水平分区, 并且它使用与 MySQL 相同的分区类型(及相应的语法)。 目前,GreptimeDB 支持 RANGE COLUMNS 分区。
每个分区仅包含表中的一部分数据, 并按某些列的值范围进行分组。 例如,我们可以在 GreptimeDB 中这样分区一个表:
CREATE TABLE (...)
PARTITION ON COLUMNS (<COLUMN LIST>) (
<RULE LIST>
);