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





