首批通过分布式安全可靠测评,为关键业务系统打造
分区类型
更新时间:2024-08-22 23:00:00
分区策略
OceanBase 数据库提供了多种分区策略,用于控制数据库如何将数据放入分区。
OceanBase 数据库的基本分区策略包括范围(Range)分区、列表(List)分区和哈希(Hash)分区。
一个一级分区仅限使用一种数据分配方法。例如,仅使用 List 分区或仅使用 Range 分区。
在进行二级分区时,表首先通过一种数据分配方法进行分区,然后使用第二种数据分配方法将每个分区进一步划分为二级分区。例如,一个表中包含 create_time 列和 user_id 列,您可以在 create_time 列上使用 Range 分区,然后在 user_id 列上使用 Hash 进行二级分区。
Range 分区
Range 分区是最常见的分区类型,通常与日期一起使用。在进行 Range 分区时,数据库根据分区键的值范围将行映射到分区。
每个 Range 分区都包含一个 VALUES LESS THAN 子句,该子句用于指定分区的非包容性上限,等于或高于此文本的分区键的任何值都将添加到下一个更高的分区。除了第一个分区之外,所有分区都有一个由上一个分区的 VALUES LESS THAN 子句指定的隐式下限。
Range 分区支持为最高分区定义 MAXVALUE。MAXVALUE 表示一个虚拟无限值,其排序高于分区键的任何其他可能值,包括空值。
Hash 分区
在进行 Hash 分区时,数据库根据数据库应用于用户指定的分区键的哈希算法将行映射到分区。行的目标分区是由内部 Hash 函数计算出一个 Hash 值,再根据 Hash 分区个数来确定的。当分区数量为 2 的幂次方时,哈希算法会创建所有分区中大致均匀的行分布。Hash 算法在分区之间均匀分布行,使分区的大小大致相同。
Hash 分区是在节点之间均匀分布数据的理想方法。Hash 分区也是范围分区的一种易于使用的替代方法,特别是当要分区的数据不是历史数据或没有明显的分区键的场景。
Hash 分区在具有极高更新冲突的 OLTP 系统里面非常有用。这是因为 Hash 分区将一个表分成几个分区,将一个表的修改分解到不同的分区修改,而不是修改整个表。
List 分区
在进行 List 分区时,数据库使用离散值列表作为每个分区的分区键。分区键由一个或多个列组成。
可以使用 List 分区来控制单个行如何映射到指定分区。
当不方便根据分区键进行排序时,可以使用 List 分区对数据进行分组和管理。
组合分区
范围(Range)分区、列表(List)分区和哈希(Hash)分区都可以作为组合分区表的二级分区策略。
在进行组合分区时,表通过一种数据分配方法进行分区,然后使用第二种数据分配方法将每个分区进一步细分为二级分区。因此,组合分区结合了基本的数据分发方法。指定分区的所有二级分区代表数据的逻辑子集。
组合分区有如下优点:
根据 SQL 语句,在一维或二维上进行分区修剪可能会提高性能。
查询可以在任一维度上使用全分区或部分分区连接。
您可以对单个表执行并行备份和恢复。
分区的数量大于单层分区,这可能有利于并行执行。
您可以实现一个滚动窗口来支持历史数据,如果许多语句可以从分区修剪或分区连接中受益,则仍然可以在另一个维度上进行分区。
您可以根据分区键的标识以不同方式存储数据。例如,您可能决定以只读的压缩格式存储特定产品类型的数据,并保持其他产品类型的数据不压缩。
下图展示了 Range-Hash 和 Range-List 组合分区。
