语法

枚举类型分区,需要枚举出每个分区的分区键的值,枚举值不能重复,并支持使用DEFAULT值定义 "catch-all" 分区。

CREATE TABLE ... 
PARTITION BY LIST(partition_expr) [PARTITIONS number]
(
  PARTITION part_name VALUES IN (list_bound_value_set),
  PARTITION part_name VALUES IN (list_bound_value_set),
  ...
)

partition_expr:
    partition_column	
  | partition_func(partition_column)

list_bound_value_set:
  list_bound_value[, list_bound_value, list_bound_value, ...]

# 分区函数定义
partition_func:
    YEAR
  | TO_DAYS
  | TO_MONTHS
  | TO_WEEKS
  | TO_SECOND
  | UNIX_TIMESTAMP
  | MONTH
  | DAYOFWEEK
  | DAYOFMONTH
  | DAYOFYEAR
  | SUBSTR
  | SUBSTRING
  | RIGHT
  | LEFT
说明

LIST分区策略与LIST COLUMNS分区策略的区别请参见List Columns分区策略与List分区策略对比

限制

  • List分区的单列分区键支持使用分区函数,但不同分区函数对分区列的数据类型有不同要求。

  • LIst分区的向量分区键不允许使用分区函数。

  • 分区列使用分区函数时,不允许嵌套多层的分区函数。

  • 默认最大分区数目不允许超过8192。

  • 默认最大分区列数目不允许超过5个。

  • 所有分区的名字不能重复,长度默认不超过16个字符。

  • 使用TIMESTAMP等时区敏感的数据类型作为分区列时,该分区列必须配套地使用UNIX_TIMESTAMP分区函数。

示例

使用分区函数

使用单列分区键datetime并通过分区函数to_days转换为日期天数,再进行列表分区。

CREATE TABLE tb_l_fn(
 id bigint not null auto_increment, 
 bid int, 
 name varchar(30),
 birthday datetime not null,
 primary key(id)
) 
PARTITION BY LIST(TO_DAYS(birthday))
(
   PARTITION p1 VALUES IN (TO_DAYS('2020-01-01'),TO_DAYS('2020-02-01')),
   PARTITION p2 VALUES IN (TO_DAYS('2021-01-01'),TO_DAYS('2021-02-01')),
   PARTITION p3 VALUES IN (TO_DAYS('2022-01-01')),
   PARTITION pm VALUES IN (DEFAULT)
)

其它分区函数的用法,请参见分区函数

不使用分区函数

使用单列分区键id进行列表分区,并指定分区数目为8。

CREATE TABLE tb_l(
 id bigint not null auto_increment, 
 bid int, 
 name varchar(30),
 birthday datetime not null,
 primary key(id)
) 
PARTITION BY LIST(id)
(
   PARTITION p1 VALUES IN (1000,1001,1002),
   PARTITION p2 VALUES IN (2000,2001,2002),
   PARTITION p3 VALUES IN (3000),
   PARTITION pm VALUES IN (DEFAULT)
)

使用向量分区键

当LIST分区使用向量分区键进行定义时,它自动会转换为LIST COLUMNS分区。例如按birthday、id两列进行列表分区(如下所示):

CREATE TABLE tb_l(
 id bigint not null auto_increment, 
 bid int, 
 name varchar(30),
 birthday datetime not null,
 primary key(id)
) 
PARTITION BY LIST(birthday,id)
(
   PARTITION p1 VALUES IN(('1990-04-03',1000),('1991-04-03',2000)),
   PARTITION p2 VALUES IN(('2000-01-03',3000),('2001-04-03',3001)),
   PARTITION pm VALUES IN(DEFAULT)
)

上述的LIST分区定义会自动转换为使用LIST COLUMNS分区定义(如下所示):

CREATE TABLE tb_l(
 id bigint not null auto_increment, 
 bid int, 
 name varchar(30),
 birthday datetime not null,
 primary key(id)
) 
PARTITION BY LIST COLUMNS(birthday,id)
(
   PARTITION p1 VALUES IN(('1990-04-03',1000),('1991-04-03',2000)),
   PARTITION p2 VALUES IN(('2000-01-03',3000),('2001-04-03',3001)),
   PARTITION pm VALUES IN(DEFAULT)
)

数据类型限制

  • 整数类型: BIGINT/BIGINT UNSINGEDINT/INT/INT UNSINGED/MEDIUMINT/MEDIUMINT UNSINGED/SMALLINT/SMALLINT UNSINGED/TINYINT/TINYINT UNSINGED

  • 时间类型:DATETIME/DATE/TIMESTAMP

  • 字符串类型:CHAR/VARCHR