[TOC] # 一级分区表 ## 创建 Range 分区表 Range 分区简单的语法格式如下: ~~~ CREATE TABLE table_name ( column_name1 column_type [, column_nameN column_type] ) PARTITION BY RANGE ( expr(column_name1) | 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`,这个值没有具体的数值,并且比其他所有分区的上限都要大,也包含空值。 示例: * MySQL 模式下,创建一个 Range 分区表。 ~~~ obclient>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 M202001 VALUES LESS THAN(UNIX_TIMESTAMP('2020/02/01')) , PARTITION M202002 VALUES LESS THAN(UNIX_TIMESTAMP('2020/03/01')) , PARTITION M202003 VALUES LESS THAN(UNIX_TIMESTAMP('2020/04/01')) , PARTITION M202004 VALUES LESS THAN(UNIX_TIMESTAMP('2020/05/01')) , PARTITION M202005 VALUES LESS THAN(UNIX_TIMESTAMP('2020/06/01')) , PARTITION M202006 VALUES LESS THAN(UNIX_TIMESTAMP('2020/07/01')) , PARTITION M202007 VALUES LESS THAN(UNIX_TIMESTAMP('2020/08/01')) , PARTITION M202008 VALUES LESS THAN(UNIX_TIMESTAMP('2020/09/01')) , PARTITION M202009 VALUES LESS THAN(UNIX_TIMESTAMP('2020/10/01')) , PARTITION M202010 VALUES LESS THAN(UNIX_TIMESTAMP('2020/11/01')) , PARTITION M202011 VALUES LESS THAN(UNIX_TIMESTAMP('2020/12/01')) , PARTITION M202012 VALUES LESS THAN(UNIX_TIMESTAMP('2021/01/01')) ); ~~~ Range 分区可以新增和删除分区。如果最后一个 Range 分区指定了`MAXVALUE`,则不能新增分区。 MySQL 模式下,Range 分区要求表分区键表达式的结果必须为整型,如果要按时间类型列做 Range 分区,则必须使用 Timestamp 类型,并且使用函数 UNIX\_TIMESTAMP 将时间类型转换为数值。这个需求也可以使用 Range Columns 分区实现,并且不需要表拆分键表达式的结果为整型。 ## 创建 Range Columns 分区表 在 OceanBase 数据库中,仅 MySQL 模式支持 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 分区。 ~~~ obclient>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 M202001 VALUES LESS THAN('2020/02/01') , PARTITION M202002 VALUES LESS THAN('2020/03/01') , PARTITION M202003 VALUES LESS THAN('2020/04/01') , PARTITION M202004 VALUES LESS THAN('2020/05/01') , PARTITION M202005 VALUES LESS THAN('2020/06/01') , PARTITION M202006 VALUES LESS THAN('2020/07/01') , PARTITION M202007 VALUES LESS THAN('2020/08/01') , PARTITION M202008 VALUES LESS THAN('2020/09/01') , PARTITION M202009 VALUES LESS THAN('2020/10/01') , PARTITION M202010 VALUES LESS THAN('2020/11/01') , PARTITION M202011 VALUES LESS THAN('2020/12/01') , PARTITION M202012 VALUES LESS THAN('2021/01/01') , PARTITION MMAX VALUES LESS THAN MAXVALUE ); ~~~ ## 创建 List 分区表 List 分区的简单语法格式如下: ~~~ CREATE TABLE table_name ( column_name1 column_type [, column_nameN column_type] ) PARTITION BY LIST ( expr(column_name1) | column_name1) ( PARTITION p0 VALUES IN ( v01 [, v0N] ) [, PARTITION pN VALUES IN ( vN1 [, vNN] ) ] [, PARTITION pX VALUES IN (default) ] ); ~~~ 当使用 List 分区时,需要遵循以下规则: * 分区表达式的结果必须是整型。 * 分区表达式只能引用一列,不能有多列(即列向量)。 示例: * MySQL 模式下创建一个 List 分区表。 ~~~ obclient>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 Columns 分区表 在 OceanBase 数据库中,仅 MySQL 模式支持 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 分区表。 ~~~ obclient>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)); ~~~ ## 创建 Hash 分区表 示例:在 MySQL 模式下,创建一个 Hash 分区表。 ~~~ obclient>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; ~~~ ## 创建 Key 分区表 在 OceanBase 数据库中,仅 MySQL 模式支持 Key 分区。 示例:创建表`t_log_part_by_Key`,将`id`、`gmt_create`键作为分区键,按 Key 分区划分为 3 个分区。 ~~~ obclient>CREATE TABLE t_log_part_by_key( id INT, gmt_create DATETIME, info VARCHAR(20)) PARTITION BY KEY(id, gmt_create) PARTITIONS 3; ~~~