首批通过分布式安全可靠测评,为关键业务系统打造
分区概述
更新时间:2026-04-16 00:11:36
本节主要介绍 OceanBase 数据库的分区介绍和分区类型。
分区介绍
OceanBase 数据库可以把普通的表的数据按照一定的规则划分到不同的区块内,同一区块的数据物理上存储在一起。这种划分区块的表叫做分区表,其中的每一个区块称作分区。OceanBase 数据库的 MySQL 模式中,单个表最多支持创建的分区个数为 8192 个。
如下图所示,一张表被划分成了 5 个分区,分布在 2 台机器上:

上图分区表的每个分区还能按照一定的规则再拆分成多个分区,这种分区表叫做二级分区表。
数据表中每一行中用于计算这一行属于哪一个分区的列的集合叫做分区键,分区键必须是主键或唯一键的子集,只要有主键就必须是主键的子集。由分区键构成的用于计算这一行属于哪一个分区的表达式叫做分区表达式。
分区分类
OceanBase 数据库 MySQL模式目前支持的分区类型如下:
Range 分区
Range Columns 分区
List 分区
List Columns 分区
Hash 分区
Key 分区
组合分区
Range 分区
Range 分区根据分区表定义时为每个分区建立的分区键值范围,将数据映射到相应的分区中。它是常见的分区类型,经常跟日期类型一起使用。例如:可以将业务日志表按日/周/月分区。
Range 分区的分区键必须是整数类型或 YEAR 类型,如果对其他类型的日期字段分区,则需要使用函数进行转换。Range 分区的分区键仅支持一列。
Range Columns 分区
Range Columns 分区与 Range 分区的作用基本类似,不同之处在于:
Range Columns 分区的分区键的结果不要求是整型,可以是以下数据类型:
支持所有整数类型,包括 TINYINT、 SMALLINT、 MEDIUMINT、 INT ( INTEGER) 和 BIGINT。
不支持将其他数值数据类型(例如,DECIMAL 或 FLOAT)的列作为分区键。
支持时间类型 DATE 和 DATETIME。
不支持使用其他与日期或时间相关数据类型的列作为分区键。
支持字符串类型 CHAR、 VARCHAR、 BINARY 和 VARBINARY。
不支持将 TEXT 或 BLOB 数据类型的列作为分区键。
Range Columns 分区的分区键不能使用表达式。
Range Columns 分区的分区键可以写多个列(即列向量)。
List 分区
List 分区使得您可以显式的控制记录行如何映射到分区,具体方法是为每个分区的分区键指定一组离散值列表,这点跟 Range 分区和 Hash 分区都不同。List 分区的优点是可以方便的对无序或无关的数据集进行分区。
List 分区的分区键可以是列名,也可以是一个表达式,分区键必须是整数类型或 YEAR 类型。
List Columns 分区
List Columns 分区与 List 分区的作用基本相同,不同之处在于:
List Columns 分区的分区键不要求是整型,可以是以下数据类型:
支持所有整数类型,包括 TINYINT、 SMALLINT、 MEDIUMINT、 INT ( INTEGER) 和 BIGINT。
不支持将其他数值数据类型(例如,DECIMAL 或 FLOAT)的列作为分区键。
支持时间类型 DATE 和 DATETIME。
不支持使用其他与日期或时间相关数据类型的列作为分区键。
支持字符串类型 CHAR、 VARCHAR、 BINARY 和 VARBINARY。
不支持将 TEXT 或 BLOB 数据类型的列作为分区键。
List Columns 分区的分区键不能使用表达式。
List Columns 分区支持多个分区键,List 分区仅支持单分区键。
Hash 分区
Hash 分区适合于对不能用 Range 分区、List 分区方法的场景,它的实现方法简单,通过对分区键上的 Hash 函数值来散列记录到不同分区中。如果您的数据符合下列特点,使用 Hash 分区是个很好的选择:
不能指定数据的分区键的列表特征。
不同范围内的数据大小相差非常大,并且很难手动调整均衡。
使用 Range 分区后数据聚集严重。
并行 DML、分区剪枝和分区连接等性能非常重要。
Hash 分区的分区键必须是整数类型或 YEAR 类型,并且可以使用表达式。
Key 分区
Key 分区与 Hash 分区类似,通过对分区键应用 Hash 算法后得到的整型值进行取模操作,从而确定数据应该属于哪个分区。
Key 分区有如下特点:
Key 分区的分区键不要求为整型,可以为除 TEXT 和 BLOB 以外的其他数据类型。
Key 分区的分区键不能使用表达式。
Key 分区的分区键支持向量。
Key 分区的分区键中不指定任何列时,表示 Key 分区的分区键是主键。
示例如下:
obclient> CREATE TABLE tbl1 (col1 INT PRIMARY KEY, col2 INT) PARTITION BY KEY() PARTITIONS 5; Query OK, 0 rows affected
组合分区
组合分区通常是先使用一种分区策略,然后在子分区再使用另外一种分区策略,适合于业务表的数据量非常大时。使用组合分区能发挥多种分区策略的优点。
分区注意事项
在 MySQL 模式中,使用自增列作为分区键时,应注意以下事项:
在 OceanBase 数据库中,自增列的值全局唯一,但在分区内不保证递增。
与其他分区方式相比,对使用自增列作为分区键的分区表的插入操作由于无法有效路由,会产生跨机事务,性能会有一定的下降。
分区名字规则
对于 List 和 Range 分区,因为在创建表的过程中就指定了分区的名字,所以名字就是当时指定的名字。
对于 Hash/Key 分区,创建时如果没有指定分区的名字,分区的命名由系统根据命名规则完成。具体表现为:
当 Hash/Key 分区为一级分区时,则每个分区分别命名为 p0、p1、...、pn。
当 Hash/Key 分区为二级分区时,则每个分区分别命名为 sp0、sp1、 ...、spn。
对于模板化二级分区表,定义二级分区后,系统根据二级分区的命名规则完成,其二级分区的命名规则为 ($part_name)s($subpart_name)。对于非模板化二级分区表,二级分区的分区名即为⾃定义的分区名。
分区表达式允许使用的函数
对于 Range、List 以及 Hash 分区,其分区键允许使用表达式。在 OceanBase 数据库的 MySQL 模式中,仅允许使用以下函数作为分区表达式: