基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
关于分区表
更新时间:2026-06-26 08:43:37
本文介绍 OceanBase 数据库的分区表。
背景信息
分区技术(Partitioning)是 OceanBase 非常重要的分布式能力之一,它能解决大表的容量问题和高并发访问时性能问题,主要思想就是将大表拆分为更多更小的结构相同的独立对象,即分区。普通的表只有一个分区,可以看作分区表的特例。每个分区只能存在于一个节点内部,分区表的不同分区可以分散在不同节点上。
分区表是指将一张大的数据表中根据一定的规则将属于同一类的数据归类到若干小表。
优势
使用分区表可以:
提高数据的管理。
增强数据的使用效率。
分区类型
分区策略
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 拆分列可以写多个列(即列向量)。
语法
RANGE 分区根据分区表定义时为每个分区建立的分区键值范围,将数据映射到相应的分区中。它是常见的分区类型,经常跟日期类型一起使用。比如说,可以将业务日志表按日/周/月分区。RANGE 分区简单的语法格式如下:
CREATE TABLE table_name (
column_name1 column_type
[, column_nameN column_type]
) PARTITION BY RANGE ( expr(column_name1) )
(
PARTITION p0 VALUES LESS THAN ( expr )
[, PARTITION pN VALUES LESS THAN (expr ) ]
[, PARTITION pX VALUES LESS THAN (maxvalue) ]
);
当使用 RANGE 分区时,需要遵守如下几个规则:
PARTITION BY RANGE ( expr ) 里的 expr 表达式的结果必须为整形。
每个分区都有一个 VALUES LESS THAN 子句,它为分区指定一个非包含的上限值。分区键的任何值等于或大于这个值时将被映射到下一个分区中。
除第一个分区外,所有分区都隐含一个下限值,即上一个分区的上限值。
允许且只允许最后一个分区上限定义为 MAXVALUE ,这个值没有具体的数值,比其他所有分区的上限都要大,也包含空值。
示例
创建一个 RANGE 分区表。
创建
t_log_part_by_range分区表。CREATE TABLE t_log_part_by_range ( log_id bigint NOT NULL, log_value varchar(50), log_date timestamp NOT NULL ) PARTITION BY RANGE(UNIX_TIMESTAMP(log_date)) ( PARTITION M197001 VALUES LESS THAN(UNIX_TIMESTAMP('1970/02/01')), PARTITION M197002 VALUES LESS THAN(UNIX_TIMESTAMP('1970/03/01')), PARTITION M197003 VALUES LESS THAN(UNIX_TIMESTAMP('1970/04/01')), PARTITION M197004 VALUES LESS THAN(UNIX_TIMESTAMP('1970/05/01')), PARTITION M197005 VALUES LESS THAN(UNIX_TIMESTAMP('1970/06/01')), PARTITION M197006 VALUES LESS THAN(UNIX_TIMESTAMP('1970/07/01')), PARTITION M197007 VALUES LESS THAN(UNIX_TIMESTAMP('1970/08/01')), PARTITION M197008 VALUES LESS THAN(UNIX_TIMESTAMP('1970/09/01')), PARTITION M197009 VALUES LESS THAN(UNIX_TIMESTAMP('1970/10/01')), PARTITION M197010 VALUES LESS THAN(UNIX_TIMESTAMP('1970/11/01')), PARTITION M197011 VALUES LESS THAN(UNIX_TIMESTAMP('1970/12/01')), PARTITION M197012 VALUES LESS THAN(UNIX_TIMESTAMP('2021/01/01')) );查看
t_log_part_by_range分区表。obclient> SHOW CREATE TABLE t_log_part_by_range\G *************************** 1. row *************************** Table: t_log_part_by_range Create Table: CREATE TABLE `t_log_part_by_range` ( `log_id` bigint(20) NOT NULL, `log_value` varchar(50) DEFAULT NULL, `log_date` timestamp NOT NULL ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 partition by range(UNIX_TIMESTAMP(log_date)) (partition M197001 values less than (1580486400), partition M197002 values less than (1582992000), partition M197003 values less than (1585670400), partition M197004 values less than (1588262400), partition M197005 values less than (1590940800), partition M197006 values less than (1593532800), partition M197007 values less than (1596211200), partition M197008 values less than (1598889600), partition M197009 values less than (1601481600), partition M197010 values less than (1604160000), partition M197011 values less than (1606752000), partition M197012 values less than (1609430400)) 1 row in set
RANGE 分区可以新增、删除分区。如果最后一个 RANGE 分区指定了 MAXVALUE ,则不能新增分区。
RANGE 分区要求表拆分键表达式的结果必须为整型,如果要按时间类型列做 RANGE 分区,则必须使用 timestamp 类型,并且使用函数 UNIX_TIMESTAMP 将时间类型转换为数值。这个需求也可以使用 RANGE COLUMNS 分区实现,就没有整型这个要求。
RANGE COLUMNS 分区
Range Columns 分区作用跟 Range 分区基本类似,不同点如下:
Range Columns 拆分列结果不要求是整型,可以是任意类型。
Range Columns 拆分列不能使用表达式。
Range Columns 拆分列可以写多个列(即列向量)。
语法
RANGE COLUMNS 分区的简单语法格式如下:
CREATE TABLE table_name (
column_name1 column_type
[, column_nameN column_type]
) PARTITION BY RANGE ( column_name1 [, column_name2] )
(
PARTITION p0 VALUES LESS THAN ( expr )
[, PARTITION pN VALUES LESS THAN (expr ) ]
[, PARTITION pX VALUES LESS THAN (maxvalue) ]
);
示例
创建一个 RANGE COLUMNS 分区。
创建
t_log_part_by_range_columns分区表。CREATE TABLE t_log_part_by_range_columns ( log_id bigint NOT NULL, log_value varchar(50), log_date date NOT NULL ) PARTITION BY RANGE COLUMNS(log_date) ( PARTITION M197001 VALUES LESS THAN('1970/02/01'), PARTITION M197002 VALUES LESS THAN('1970/03/01'), PARTITION M197003 VALUES LESS THAN('1970/04/01'), PARTITION M197004 VALUES LESS THAN('1970/05/01'), PARTITION M197005 VALUES LESS THAN('1970/06/01'), PARTITION M197006 VALUES LESS THAN('1970/07/01'), PARTITION M197007 VALUES LESS THAN('1970/08/01'), PARTITION M197008 VALUES LESS THAN('1970/09/01'), PARTITION M197009 VALUES LESS THAN('1970/10/01'), PARTITION M197010 VALUES LESS THAN('1970/11/01'), PARTITION M197011 VALUES LESS THAN('1970/12/01'), PARTITION M197012 VALUES LESS THAN('2021/01/01'), PARTITION MMAX VALUES LESS THAN MAXVALUE );查看
t_log_part_by_range_columns分区表。obclient> SHOW create table t_log_part_by_range_columns\G *************************** 1. row *************************** Table: t_log_part_by_range_columns Create Table: CREATE TABLE `t_log_part_by_range_columns` ( `log_id` bigint(20) NOT NULL, `log_value` varchar(50) DEFAULT NULL, `log_date` date NOT NULL ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 partition by range columns(log_date) (partition M197001 values less than ('1970-02-01'), partition M197002 values less than ('1970-03-01'), partition M197003 values less than ('1970-04-01'), partition M197004 values less than ('1970-05-01'), partition M197005 values less than ('1970-06-01'), partition M197006 values less than ('1970-07-01'), partition M197007 values less than ('1970-08-01'), partition M197008 values less than ('1970-09-01'), partition M197009 values less than ('1970-10-01'), partition M197010 values less than ('1970-11-01'), partition M197011 values less than ('1970-12-01'), partition M197012 values less than ('2021-01-01'), partition MMAX values less than (MAXVALUE)) 1 row in set
Hash 分区
在进行 Hash 分区时,数据库根据数据库应用于用户指定的分区键的哈希算法将行映射到分区。
行的目标分区是由内部 Hash 函数计算出一个 Hash 值,再根据 Hash 分区个数来确定的。当分区数量为 2 的幂次方时,哈希算法会创建所有分区中大致均匀的行分布。
哈希算法在分区之间均匀分布行,使分区的大小大致相同。
Hash 分区是在节点之间均匀分布数据的理想方法。Hash 分区也是 Range 分区的一种易于使用的替代方法,特别是当要分区的数据不是历史数据或没有明显的分区键的场景。
Hash 分区在具有极高更新冲突的 OLTP 系统里面非常有用。这是因为 Hash 分区将一个表分成几个分区,将一个表的修改分解到不同的分区修改,而不是修改整个表。
Hash 分区键的表达式必须返回 INT 类型。
语法
HASH 分区适合于对不能用 RANGE 分区、LIST 分区方法的场景,它的实现方法简单,通过对分区键上的 HASH 函数值来散列记录到不同分区中。如果您的数据符合下列特点,使用 HASH 分区是个很好的选择:
不能指定数据的分区键的列表特征。
不同范围内的数据大小相差非常大,并且很难手动调整均衡。
使用 RANGE 分区后数据聚集严重。
并行 DML、分区剪枝和分区连接等性能非常重要。
CREATE TABLE table_name (column_name column_type[,column_name column_type]) PARTITION BY { HASH(expr) | KEY([column_name_list]) } PARTITIONS partition_count;
示例
创建一个 HASH 分区表。
创建
ware表。CREATE TABLE ware ( w_id int, w_ytd number(12, 2), w_tax number(4, 4), w_name varchar(10), w_street_1 varchar(20), w_street_2 varchar(20), w_city varchar(20), w_state char(2), w_zip char(9), PRIMARY KEY (w_id) ) PARTITION BY HASH (w_id) PARTITIONS 60;说明
HASH 分区不支持做删除操作。
查看
ware分区表。obclient> SHOW CREATE TABLE ware\G *************************** 1. row *************************** Table: ware Create Table: CREATE TABLE `ware` ( ` w_id` int DEFAULT NULL, `w_name` varchar(10) DEFAULT NULL, `w_street_1` varchar(20) DEFAULT NULL, `w_street_2` varchar(20) DEFAULT NULL, `w_city` varchar(20) DEFAULT NULL, `w_state` char(2) DEFAULT NULL, `w_zip` char(9) DEFAULT NULL, PRIMARY KEY (`w_id`) ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 partition by hash(w_id) (partition p0, partition p1, partition p2, partition p3, partition p4, partition p5, partition p6, partition p7, partition p8, partition p9, partition p10, partition p11, partition p12, partition p13, partition p14, partition p15, partition p16, partition p17, partition p18, partition p19, partition p20, partition p21, partition p22, partition p23, partition p24, partition p25, partition p26, partition p27, partition p28, partition p29, partition p30, partition p31, partition p32, partition p33, partition p34, partition p35, partition p36, partition p37, partition p38, partition p39, partition p40, partition p41, partition p42, partition p43, partition p44, partition p45, partition p46, partition p47, partition p48, partition p49, partition p50, partition p51, partition p52, partition p53, partition p54, partition p55, partition p56, partition p57, partition p58, partition p59) 1 row in set
Key 分区
Key 分区和 Hash 分区类似。主要区别如下:
Hash 分区的分区键可以是用户自定义的表达式,而 Key 分区的分区键只能是列,或者不指定。
key 分区的分区键不限于
INT类型。
key 分区可以指定或不指定列,也可以指定多个列作为分区键。如果表上有主键,那么这些列必须是表的主键的一部分,或者全部。如果 Key 分区不指定分区键,那么分区键就是主键列。如果没有主键,有 UNIQUE 键,那么分区键就是 UNIQUE 键。
语法
KEY 分区与Hash分区类似,支持除 TEXT 和 BLOB 之外的所有数据类型的分区。Key 分区不允许使用用于自定义的表达式,需要使用 MySQL 服务器提供的 Hash 函数。
CREATE TABLE table_name (column_name column_type[,column_name column_type])
PARTITION BY { HASH(expr) | KEY([column_name_list]) }
PARTITIONS partition_count;
示例
创建一个 Key 分区表。
创建
t_key_ny表。CREATE TABLE t_key_ny ( id INT , var CHAR(32) ) PARTITION BY KEY(var) PARTITIONS 10;查看
t_key_ny表。obclient> SHOW create table t_key_ny\G *************************** 1. row *************************** Table: t_key_ny Create Table: CREATE TABLE `t_key_ny` ( `id` int(11) DEFAULT NULL, `var` char(32) DEFAULT NULL ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 partition by key(var) (partition p0, partition p1, partition p2, partition p3, partition p4, partition p5, partition p6, partition p7, partition p8, partition p9) 1 row in set
List 分区
在进行 List 分区时,数据库使用离散值列表作为每个分区的分区键。分区键由一个或多个列组成。
您可以使用 List 分区来控制单个行如何映射到指定分区。当不方便根据分区键进行排序时,可以使用 List 分区对数据进行分组和管理。
List 分区仅支持单分区键,分区键可以是一列,也可以是一个表达式。分区键的数据类型仅支持 INT 类型。
语法
LIST 分区使得您可以显式的控制记录行如何映射到分区,具体方法是为每个分区的分区键指定一组离散值列表,这点跟 RANGE 分区和 HASH 分区都不同。LIST 分区的优点是可以方便的对无序或无关的数据集进行分区。LIST 分区的简单语法格式如下:
CREATE TABLE table_name (
column_name1 column_type
[, column_nameN column_type]
) PARTITION BY LIST ( expr(column_name1) )
(
PARTITION p0 VALUES IN ( v01 [, v0N] )
[, PARTITION pN VALUES IN ( vN1 [, vNN] ) ]
[, PARTITION pX VALUES IN (default) ]
);
当使用列表分区时,需要遵守以下规则:
分区表达式结果必须是整型。
分区表达式只能引用一列,不能有多列(即列向量)。
示例
创建一个 LIST 分区表。
创建
t_part_by_list表。CREATE TABLE t_part_by_list ( c1 BIGINT PRIMARY KEY, c2 VARCHAR(50) ) PARTITION BY list(c1) ( PARTITION p0 VALUES IN (1, 2, 3), PARTITION p1 VALUES IN (5, 6), PARTITION p2 VALUES IN (DEFAULT) );说明
LIST 分区可以新增分区,指定新的不重复的列表。也可以删除分区。
查看
t_part_by_list分区表。obclient> SHOW create table t_part_by_list\G *************************** 1. row *************************** Table: t_part_by_list Create Table: CREATE TABLE `t_part_by_list` ( `c1` bigint(20) NOT NULL, `c2` varchar(50) DEFAULT NULL, PRIMARY KEY (`c1`) ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 partition by list(c1) (partition p0 values in (1,2,3), partition p1 values in (5,6), partition p2 values in (DEFAULT)) 1 row in set
List Columns 分区
如果要使用多列的 List 分区,或者其他数据类型的 List 分区,可以使用 List Columns 分区。
List Columns 分区是 List 分区的一个扩展,支持多个分区键,并且支持 INT 数据、DATE 类型和 DATETIME 类型。
语法
LIST COLUMNS 分区作用跟 LIST 分区基本相同,不同之处在于:
LIST COLUMNS 的拆分列不能是表达式。
LIST COLUMNS 的拆分列可以是多列(即列向量)。
LIST COLUMNS 分区简单的语法格式如下:
CREATE TABLE table_name (
column_name1 column_type
[, column_nameN column_type]
) PARTITION BY LIST COLUMNS ( column_name1 [, column_nameN ] )
(
PARTITION p0 VALUES IN ( v01 [, v0N] )
[, PARTITION pN VALUES IN ( vN1 [, vNN] ) ]
[, PARTITION pX VALUES IN (default) ]
);
示例
创建一个 LIST COLUMNS 分区。
创建
t2表。CREATE TABLE t2 ( id varchar(64), type varchar(16), info varchar(512), gmt_create datetime(6), gmt_modified datetime(6), partition_id varchar(2) GENERATED ALWAYS AS (substr(`id`, 19, 20)) VIRTUAL, PRIMARY KEY (id) ) partition by list columns(partition_id) ( partition p0 values in ('00', '01'), partition p1 values in ('02', '03'), partition p2 values in (default) );查看
t2分区表。obclient> SHOW CREATE TABLE t2\G *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `id` varchar(64) NOT NULL, `type` varchar(16) DEFAULT NULL, `info` varchar(512) DEFAULT NULL, `gmt_create` datetime(6) DEFAULT NULL, `gmt_modified` datetime(6) DEFAULT NULL, `partition_id` varchar(2) GENERATED ALWAYS AS (substr(`id`,19,20)) VIRTUAL, PRIMARY KEY (`id`) ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 partition by list columns(partition_id) (partition p0 values in ('00','01'), partition p1 values in ('02','03'), partition p2 values in (DEFAULT)) 1 row in set
二级分区
范围(Range)分区、列表(List)分区和哈希(Hash)分区都可以作为组合分区表的二级分区策略。
在进行组合分区时,表通过一种数据分配方法进行分区,然后使用第二种数据分配方法将每个分区进一步细分为二级分区。因此,组合分区结合了基本的数据分发方法。指定分区的所有二级分区代表数据的逻辑子集。
组合分区有如下优点:
根据 SQL 语句,在一维或二维上进行分区修剪可能会提高性能。
查询可以在任一维度上使用全分区或部分分区连接。
您可以对单个表执行并行备份和恢复。
分区的数量大于单层分区,这可能有利于并行执行。
您可以实现一个滚动窗口来支持历史数据,如果许多语句可以从分区修剪或分区连接中受益,则仍然可以在另一个维度上进行分区。
您可以根据分区键的标识以不同方式存储数据。例如,您可能决定以只读的压缩格式存储特定产品类型的数据,并保持其他产品类型的数据不压缩。
下图展示了 Range-Hash 和 Range-List 组合分区。
示例
创建
t_ordr_part_by_hash_range表。CREATE TABLE t_ordr_part_by_hash_range ( o_w_id int, o_d_id int, o_id int, o_c_id int, o_carrier_id int, o_ol_cnt int, o_all_local int, o_entry_d TIMESTAMP NOT NULL, index idx_ordr(o_w_id, o_d_id, o_c_id, o_id) LOCAL, primary key (o_w_id, o_d_id, o_id, o_entry_d) ) PARTITION BY hash(o_w_id) SUBPARTITION BY RANGE(UNIX_TIMESTAMP(o_entry_d)) SUBPARTITION template ( SUBPARTITION M197001 VALUES LESS THAN(UNIX_TIMESTAMP('1970/02/01')), SUBPARTITION M197002 VALUES LESS THAN(UNIX_TIMESTAMP('1970/03/01')), SUBPARTITION M197003 VALUES LESS THAN(UNIX_TIMESTAMP('1970/04/01')), SUBPARTITION M197004 VALUES LESS THAN(UNIX_TIMESTAMP('1970/05/01')), SUBPARTITION M197005 VALUES LESS THAN(UNIX_TIMESTAMP('1970/06/01')), SUBPARTITION M197006 VALUES LESS THAN(UNIX_TIMESTAMP('1970/07/01')), SUBPARTITION M197007 VALUES LESS THAN(UNIX_TIMESTAMP('1970/08/01')), SUBPARTITION M197008 VALUES LESS THAN(UNIX_TIMESTAMP('1970/09/01')), SUBPARTITION M197009 VALUES LESS THAN(UNIX_TIMESTAMP('1970/10/01')), SUBPARTITION M197010 VALUES LESS THAN(UNIX_TIMESTAMP('1970/11/01')), SUBPARTITION M197011 VALUES LESS THAN(UNIX_TIMESTAMP('1970/12/01')), SUBPARTITION M197012 VALUES LESS THAN(UNIX_TIMESTAMP('2021/01/01')), SUBPARTITION MMAX VALUES LESS THAN MAXVALUE ) partitions 16;查看
t_ordr_part_by_hash_range表。obclient> SHOW CREATE TABLE t_ordr_part_by_hash_range\G *************************** 1. row *************************** Table: t_ordr_part_by_hash_range Create Table: CREATE TABLE `t_ordr_part_by_hash_range` ( `o_w_id` int(11) NOT NULL, `o_d_id` int(11) NOT NULL, `o_id` int(11) NOT NULL, `o_c_id` int(11) DEFAULT NULL, `o_carrier_id` int(11) DEFAULT NULL, `o_ol_cnt` int(11) DEFAULT NULL, `o_all_local` int(11) DEFAULT NULL, `o_entry_d` timestamp NOT NULL, PRIMARY KEY (`o_w_id`, `o_d_id`, `o_id`, `o_entry_d`), KEY `idx_ordr` (`o_w_id`, `o_d_id`, `o_c_id`, `o_id`) BLOCK_SIZE 16384 LOCAL ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 partition by hash(o_w_id) subpartition by range(UNIX_TIMESTAMP(o_entry_d)) subpartition template ( subpartition M197001 values less than (2649600), subpartition M197002 values less than (5068800), subpartition M197003 values less than (7747200), subpartition M197004 values less than (10339200), subpartition M197005 values less than (13017600), subpartition M197006 values less than (15609600), subpartition M197007 values less than (18288000), subpartition M197008 values less than (20966400), subpartition M197009 values less than (23558400), subpartition M197010 values less than (26236800), subpartition M197011 values less than (28828800), subpartition M197012 values less than (1609430400), subpartition MMAX values less than (MAXVALUE)) (partition p0, partition p1, partition p2, partition p3, partition p4, partition p5, partition p6, partition p7, partition p8, partition p9, partition p10, partition p11, partition p12, partition p13, partition p14, partition p15) 1 row in set创建
t_log_part_by_range_hash表。CREATE TABLE t_log_part_by_range_hash ( log_id int NOT NULL, log_value varchar(50), log_date TIMESTAMP NOT NULL, PRIMARY key(log_id, log_date) ) PARTITION BY RANGE(UNIX_TIMESTAMP(log_date)) SUBPARTITION BY HASH(log_id) SUBPARTITIONS 16 ( PARTITION M197001 VALUES LESS THAN(UNIX_TIMESTAMP('1970/02/01')), PARTITION M197002 VALUES LESS THAN(UNIX_TIMESTAMP('1970/03/01')), PARTITION M197003 VALUES LESS THAN(UNIX_TIMESTAMP('1970/04/01')), PARTITION M197004 VALUES LESS THAN(UNIX_TIMESTAMP('1970/05/01')), PARTITION M197005 VALUES LESS THAN(UNIX_TIMESTAMP('1970/06/01')), PARTITION M197006 VALUES LESS THAN(UNIX_TIMESTAMP('1970/07/01')), PARTITION M197007 VALUES LESS THAN(UNIX_TIMESTAMP('1970/08/01')), PARTITION M197008 VALUES LESS THAN(UNIX_TIMESTAMP('1970/09/01')), PARTITION M197009 VALUES LESS THAN(UNIX_TIMESTAMP('1970/10/01')), PARTITION M197010 VALUES LESS THAN(UNIX_TIMESTAMP('1970/11/01')), PARTITION M197011 VALUES LESS THAN(UNIX_TIMESTAMP('1970/12/01')), PARTITION M197012 VALUES LESS THAN(UNIX_TIMESTAMP('2021/01/01')), PARTITION MMAX VALUES LESS THAN MAXVALUE );查看
t_log_part_by_range_hash表。obclient> SHOW CREATE TABLE t_log_part_by_range_hash\G *************************** 1. row *************************** Table: t_log_part_by_range_hash Create Table: CREATE TABLE `t_log_part_by_range_hash` ( `log_id` int(11) NOT NULL, `log_value` varchar(50) DEFAULT NULL, `log_date` timestamp NOT NULL, PRIMARY KEY (`log_id`, `log_date`) ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 partition by range(UNIX_TIMESTAMP(log_date)) subpartition by hash(log_id) subpartition template ( subpartition p0, subpartition p1, subpartition p2, subpartition p3, subpartition p4, subpartition p5, subpartition p6, subpartition p7, subpartition p8, subpartition p9, subpartition p10, subpartition p11, subpartition p12, subpartition p13, subpartition p14, subpartition p15) (partition M197001 values less than (2649600), partition M197002 values less than (5068800), partition M197003 values less than (7747200), partition M197004 values less than (10339200), partition M197005 values less than (13017600), partition M197006 values less than (15609600), partition M197007 values less than (18288000), partition M197008 values less than (20966400), partition M197009 values less than (23558400), partition M197010 values less than (26236800), partition M197011 values less than (28828800), partition M197012 values less than (1609430400), partition MMAX values less than (MAXVALUE)) 1 row in set