二级分区是按照两个维度来把数据拆分成分区的操作。最常用的地方是类似用户账单的场景。
OceanBase 数据库目前支持 HASH、RANGE 和 LIST 三种分区⽅式,MySQL 模式下还支持 KEY、RANGE COLUMNS 和 LIST COLUMNS 三种分区方式,并且支持任意两种分区方式的组合。
当前 MySQL 模式和 Oracle 模式均支持的二级分区如下:
HASH + HASH 分区
HASH + RANGE 分区
HASH+ LIST 分区
RANGE + HASH 分区
RANGE +RANGE 分区
RANGE +LIST 分区
LIST+ HASH 分区
LIST+RANGE 分区
LIST+LIST 分区
除上述二级分区外,MySQL 模式还支持以下二级分区:
HASH +KEY 分区
HASH +RANGE COLUMNS 分区
HASH +LIST COLUMNS 分区
RANGE +KEY 分区
RANGE +RANGE COLUMNS 分区
RANGE +LIST COLUMNS 分区
LIST+KEY 分区
LIST+RANGE COLUMNS 分区
LIST+LIST COLUMNS 分区
KEY +HASH 分区
KEY +RANGE 分区
KEY+LIST 分区
KEY +RANGE COLUMNS 分区
KEY +LIST COLUMNS 分区
RANGE COLUMNS+HASH分区
RANGE COLUMNS+RANGE 分区
RANGE COLUMNS+LIST 分区
RANGE COLUMNS+KEY 分区
RANGE COLUMNS+LIST COLUMNS 分区
LIST COLUMNS +HASH 分区
LIST COLUMNS +RANGE 分区
LIST COLUMNS +LIST 分区
LIST COLUMNS +KEY 分区
LIST COLUMNS +RANGE COLUMNS 分区
当前,⼆级分区表可分为模板化二级分区表和非模板化二级分区表。
创建模板化二级分区表
模板化⼆级分区表的每个⼀级分区下的⼆级分区都按照模板中的⼆级分区定义,即每个⼀级分区下的⼆级分区定义均相同。
语法如下:
CREATE TABLE ....
partition BY [hash|range|list] (column_list)
subpartition BY [hash|range|list] (column_list)
subpartition template
(
subpartition subpart_name subpartition_define
, ...
)
(
partition part_name partition_define
, ...
对于模板化⼆级分区表来说,⼆级分区的命名规则为 ($part_name)s($subpart_name) 。
例如,对于下⾯的 t_range_range 表,p0 下的 3 个⼆级分区的分区名分别为 p0srp1、p0srp2、p0srp3。
obclient> CREATE TABLE t_range_range (c1 int, c2 int, c3 int) partition BY range(c1)
subpartition BY range (c2)
subpartition template
(
subpartition rp1 VALUES less than (100),
subpartition rp2 VALUES less than (200),
subpartition rp3 VALUES less than (300)
)
(
partition p0 VALUES less than (100),
partition p1 VALUES less than (200),
partition p2 VALUES less than (300)
);
创建非模板化二级分区表
⾮模板化⼆级分区表的每个⼀级分区下的⼆级分区均可以⾃由定义,即每个⼀级分区下的⼆级分区的定义可以相同也可以不同。
CREATE TABLE ....
partition BY [hash|range|list] (column_list)
subpartition BY [hash|range|list] (column_list)
(
partition part_name partition_define
(
subpartition subpart_name subpartition_define
, ...
)
, ...
)
对于⾮模板化⼆级分区表来说,⼆级分区的分区名即为⾃定义的分区名。
例如,对于下⾯的 t_range_range1 表,p0 下的 3个⼆级分区的分区名分别是 p0_r1、p0_r2、p0_r3。
obclient> CREATE TABLE t_range_range1 (c1 int, c2 int, c3 int) partition BY range(c1)
subpartition BY range (c2)
(
partition p0 VALUES less than (100)
(
subpartition p0_r1 VALUES less than (100),
subpartition p0_r2 VALUES less than (200),
subpartition p0_r3 VALUES less than (300)
),
partition p1 VALUES less than (200)
(
subpartition p1_r1 VALUES less than (100),
subpartition p1_r2 VALUES less than (200),
subpartition p1_r3 VALUES less than (300)
),
partition p2 VALUES less than (300)
(
subpartition p2_r1 VALUES less than (100),
subpartition p2_r2 VALUES less than (200),
subpartition p2_r3 VALUES less than (300)
)
);