语法
按照范围边界进行分区,常用于按照时间边界进行分区。分区边界必须是递增的,支持使用MAXVALUE作为最大边界值。
CREATE TABLE ...
PARTITION BY RANGE(partition_expr) [PARTITIONS number]
(
PARTITION part_name VALUES LESS THAN (range_bound_value),
PARTITION part_name VALUES LESS THAN (range_bound_value),
...
)
partition_expr:
partition_column
| partition_func(partition_column)
# 分区函数定义
partition_func:
YEAR
| TO_DAYS
| TO_MONTHS
| TO_WEEKS
| TO_SECOND
| UNIX_TIMESTAMP
| MONTH
| DAYOFWEEK
| DAYOFMONTH
| DAYOFYEAR
| SUBSTR
| SUBSTRING
| RIGHT
| LEFT
说明
RANGE分区策略与RANGE COLUMNS分区策略的区别请参见Range Columns分区策略与Range分区策略对比。
限制
Range分区的单列分区键支持使用分区函数,但不同分区函数对分区列的数据类型有不同要求。
Range分区的向量分区键不允许使用分区函数。
分区列使用分区函数时,不允许嵌套多层的分区函数。
所有分区的名字不能重复,长度默认不能超过16个字符。
使用TIMESTAMP等时区敏感的数据类型作为分区列时,该分区列必须配套地使用UNIX_TIMESTAMP分区函数。
默认最大分区数目不允许超过8192个;
默认最大分区列数目不允许超过5个。
示例
使用分区函数
使用单列分区键datetime并通过分区函数to_days转换为日期天数,再进行范围分区。
CREATE TABLE tb_r_fn(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY RANGE(TO_DAYS(birthday))
(
PARTITION p1 VALUES LESS THAN(TO_DAYS('2020-01-01')),
PARTITION p2 VALUES LESS THAN(TO_DAYS('2021-01-01')),
PARTITION p3 VALUES LESS THAN(TO_DAYS('2022-01-01')),
PARTITION pm VALUES LESS THAN(MAXVALUE)
)
其它分区函数的用法,请参见分区函数。
不使用分区函数
使用单列分区键id进行范围分区,并指定分区数目为8。
CREATE TABLE tb_r(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY RANGE(id)
(
PARTITION p1 VALUES LESS THAN(1000),
PARTITION p2 VALUES LESS THAN(2000),
PARTITION p3 VALUES LESS THAN(3000),
PARTITION pm VALUES LESS THAN(MAXVALUE)
)
使用向量分区键
当RANGE分区使用向量分区键进行定义时 ,它自动会转换为RANGE COLUMNS分区。例如按(bid,id)两个列进行范围分区(如下所示):
CREATE TABLE tb_r(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY RANGE(bid,id)
(
PARTITION p1 VALUES LESS THAN(1,1000),
PARTITION p2 VALUES LESS THAN(2,2000),
PARTITION pm VALUES LESS THAN(MAXVALUE, MAXVALUE)
)
上述的RANGE分区定义会自动转换为使用RANGE COLUMNS分区定义(如下所示):
CREATE TABLE tb_r(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY RANGE COLUMNS(bid,id)
(
PARTITION p1 VALUES LESS THAN(1,1000),
PARTITION p2 VALUES LESS THAN(2,2000),
PARTITION pm VALUES LESS THAN(MAXVALUE, MAXVALUE)
)
数据类型限制
整数类型: BIGINT/BIGINT UNSINGEDINT/INT/INT UNSINGED/MEDIUMINT/MEDIUMINT UNSINGED/SMALLINT/SMALLINT UNSINGED/TINYINT/TINYINT UNSINGED
时间类型:DATETIME/DATE/TIMESTAMP
字符串类型:CHAR/VARCHR