云服务器内容精选

  • INTERVAL RANGE分区表与任意类型表的相互转换 语法: 其他类型表转化为INTERVAL RANGE分区表。 ALTER TABLE table_name table_definition partition_options; ​ partition_options: PARTITION BY { RANGE{(expr) | COLUMNS(column_list)} } { INTERVAL(type, value) | INTERVAL(value) } [(partition_definition [, partition_definition] ...)] ​ partition_definition: PARTITION partition_name [VALUES LESS THAN {expr | MAXVALUE}] [[STORAGE] ENGINE [=] engine_name] [COMMENT [=] 'string' ] [DATA DIRECTORY [=] 'data_dir'] [INDEX DIRECTORY [=] 'index_dir'] [MAX_ROWS [=] max_number_of_rows] [MIN_ROWS [=] min_number_of_rows] [TABLESPACE [=] tablespace_name] INTERVAL子句关联参数说明: 表3 参数说明 参数名称 参数说明 INTERVAL(value) 使用RANGE(expr) 或者 RANGE COLUMNS(column_list)且column是整型字段时,INTERVAL子句的格式,其中value代表间隔数值,必须是正整数。 expr RANGE(expr)中的分区表达式,目前只支持整数类型。 column_list RANGE COLUMNS(column_list)的分区字段列表,在INTERVAL RANGE分区表中,column_list只能是单列。 INTERVAL(type, value) 使用RANGE COLUMNS(column_list)且column_list是DATE/TIME/DATETIME类型时,INTERVAL子句的格式,其中type代表间隔类型,value代表间隔数值。 type目前支持8种时间类型(YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND)。 value代表间隔数值,必须是正整数;当type为SECOND类型时,间隔不能小于60。 INTERVAL RANGE分区表转化为其他任意类型的表,这里partition_options是可选的。 ALTER TABLE table_name table_definition [partition_options]; 示例: 将其他类型表转为INTERVAL RANGE表: CREATE TABLE orders( orderkey BIGINT NOT NULL, custkey BIGINT NOT NULL, orderdate DATE NOT NULL ); ​ ALTER TABLE orders PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) ( PARTITION p0 VALUES LESS THAN('2021-10-01') ); 将INTERVAL RANGE表转化为其他类型表: CREATE TABLE orders (a INT, b DATETIME) PARTITION BY RANGE (a) INTERVAL(10) ( PARTITION p0 VALUES LESS THAN(10), PARTITION p2 VALUES LESS THAN(20) ); ​ ALTER TABLE orders PARTITION BY LIST COLUMNS (a) ( PARTITION p0 VALUES IN (1, 11, 25) ); 修改INTERVAL RANGE表的INTERVAL子句信息: CREATE TABLE orders (a INT, b DATETIME) PARTITION BY RANGE (a) INTERVAL(10) ( PARTITION p0 VALUES LESS THAN(10), PARTITION p2 VALUES LESS THAN(20) ); ​ ALTER TABLE orders PARTITION BY RANGE (a) INTERVAL(20) ( PARTITION p0 VALUES LESS THAN(10), PARTITION p2 VALUES LESS THAN(20) ); ​ # 消除INTERVAL子句 ALTER TABLE orders PARTITION BY RANGE (a) ( PARTITION p0 VALUES LESS THAN(10), PARTITION p2 VALUES LESS THAN(20) ); ​ # 添加INTERVAL子句 ALTER TABLE orders PARTITION BY RANGE (a) INTERVAL(100) ( PARTITION p0 VALUES LESS THAN(10), PARTITION p2 VALUES LESS THAN(20) );
  • 创建INTERVAL RANGE分区表 INTERVAL RANGE分区表定义格式类似于RANGE分区表,但多了INTERVAL子句。 语法: CREATE TABLE [IF NOT EXISTS] [schema.]table_name table_definition partition_options; 其中,partition_options为: PARTITION BY RANGE {(expr) | COLUMNS(column_list)} {INTERVAL(value) | INTERVAL(type, expr)} (partition_definition [, partition_definition] ...) partition_definition为: PARTITION partition_name [VALUES LESS THAN {expr | MAXVALUE}] [[STORAGE] ENGINE [=] engine_name] [COMMENT [=] 'string' ] [DATA DIRECTORY [=] 'data_dir'] [INDEX DIRECTORY [=] 'index_dir'] [MAX_ROWS [=] max_number_of_rows] [MIN_ROWS [=] min_number_of_rows] [TABLESPACE [=] tablespace_name] 其中,INTERVAL子句仅支持设置间隔数值(value)和间隔类型(type)。 INTERVAL子句关联参数说明: 表2 参数说明 参数名称 参数说明 INTERVAL(value) 使用RANGE(expr) 或者 RANGE COLUMNS(column_list)且column是整型字段时,INTERVAL子句的格式,其中value代表间隔数值,必须是正整数。 expr RANGE(expr)中的分区表达式,目前只支持整数类型。 column_list RANGE COLUMNS(column_list)的分区字段列表,在INTERVAL RANGE分区表中,column_list只能是单列。 INTERVAL(type, value) 使用RANGE COLUMNS(column_list)且column_list是DATE/TIME/DATETIME类型时,INTERVAL子句的格式,其中type代表间隔类型,value代表间隔数值。 type目前支持8种时间类型(YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND)。 value代表间隔数值,必须是正整数;当type为SECOND类型时,间隔不能小于60。 间隔数值(value)和间隔类型(type)的进一步说明:
  • SET INTERVAL子句支持 支持使用SET INTERVAL子句修改INTERVAL RANGE表定义的INTERVAL子句间隔类型和间隔值,也可实现消除或添加INTERVAL子句。 语法: ALTER TABLE table_name SET INTERVAL {() | (type, value) | (value)}; 表4 参数说明 参数名称 参数说明 type 目前支持8种时间类型(YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND),不显式指定默认是数字类型的间隔。 value 指定间隔的数值大小。当type为SECOND类型时,间隔不能小于60。 示例: 修改INTERVAL RANGE表的INTERVAL类型和值。 CREATE TABLE orders( orderkey BIGINT NOT NULL, custkey BIGINT NOT NULL, orderdate DATE NOT NULL ) PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) ( PARTITION p0 VALUES LESS THAN('2021-10-01') ); ​ ALTER TABLE orders SET INTERVAL(YEAR, 1); 实现RANGE表和INTERVAL RANGE表之间的转化。 CREATE TABLE orders( orderkey BIGINT NOT NULL, custkey BIGINT NOT NULL, orderdate DATE NOT NULL ) PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) ( PARTITION p0 VALUES LESS THAN('2021-10-01') ); ​ # 删除INTERVAL子句 ALTER TABLE sales SET INTERVAL(); ​ # 添加INTERVAL子句 ALTER TABLE sales SET INTERVAL(DAY, 60); 即使当前功能开关rds_interval_range_enabled关闭,"ALTER TABLE table_name SET INTERVAL()"语句也可使用(用于消除INTERVAL RANGE表的INTERVAL子句定义信息,转化为普通RANGE表)。
  • 使用限制 INTERVAL RANGE表只支持HASH/KEY二级分区。 采取RANGE COLUMNS(column_list) INTERVAL([type], value)形式描述INTERVAL RANGE规则时: column_list(分区键)中列个数只能为1,并且只能是是整数类型或者DATE/TIME/DATETIME类型。 如果分区键是整型,INTERVAL的间隔类型type不需要填写。 如果分区键为DATE类型,INTERVAL的间隔类型type只能取YEAR、QUARTER、MONTH、WEEK、DAY。 如果分区键为TIME类型,INTERVAL的间隔类型type只能取HOUR、MINUTE、SECOND。 如果分区间为DATETIME类型,INTERVAL的间隔类型type可以取YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND。 间隔值value只能为正整数。 如果INTERVAL的间隔类型是SECOND,间隔不能小于60。 采取RANGE(expr) INTERVAL(value)形式描述INTERVAL RANGE规则时,expr表达式的结果应为整数,间隔值value只能为正整数。 不支持使用INSERT ...SELECT语句、INSERT ...ON DUPLICATE KEY UPDATE语句、UPDATE语句触发分区新增。 LOAD DATA时不会触发分区新增(如果分区覆盖了所有插入数据的范围,能使用load data导入数据,如果分区没有覆盖插入数据的范围,load data无法触发自增分区,导入数据失败)。 事务中如果触发分区自增,一旦新分区创建成功,不支持回滚。 自增的分区使用'_p'作为分区名的前缀,因此客户设置的以此开头的分区名可能导致分区自增失败。 SET INTERVAL([type], value)子句只适用于INTERVAL RANGE表和RANGE表,如果这两种表有二级分区,只支持二级分区为HASH或KEY类型。 SET INTERVAL([type], value)子句的type和value取值要受原表的分区表达式expr或分区键column_list的约束。
  • 修改LIST DEFAULT HASH分区表 LIST DEFAULT HASH分区支持所有修改分区表的语法,包括ALTER TABLE ADD PARTITION、ALTER TABLE DROP PARTITION、ALTER TABLE REORGANIZE PARTITION、ALTER TABLE TRUNCATE PARTITION、ALTER TABLE EXCHANGE PARTITION、ALTER TABLE OPTIMIZE PARTITIONALTER TABLE REBUILD PARTITION、ALTER TABLE REPAIR PARTITION、ALTER TABLE ANALYZE PARTITION、ALTER TABLE CHECK PARTITION操作。除了ALTER TABLE ADD PARTITION,ALTER TABLE DROP PARTITION,ALTER TABLE REORGANIZE PARTITION有特殊的使用方法和限制,其他的语法同其他类型的分区表使用方法一样。 ALTER TABLE ADD PARTITION ADD DEFAULT PARTITION 对于没有DEFAULT分区的普通LIST分区表,通过ADD PARTITION增加DEFAULT分区,使之变成LIST DEFAULT HASH分区表。 ALTER TABLE table_name ADD PARTITION(default_partition_definition) 增加一个DEFAULT分区示例如下: CREATE TABLE list_tab ( a INT, b INT ) PARTITION BY LIST (a) (PARTITION p0 VALUES IN (1,2,3,4,5), PARTITION p1 VALUES IN (6,7,8,9,10) ); ALTER TABLE list_tab ADD PARTITION(PARTITION pd DEFAULT); 增加两个DEFAULT分区示例如下: CREATE TABLE list_tab ( a INT, b INT ) PARTITION BY LIST (a) (PARTITION p0 VALUES IN (1,2,3,4,5), PARTITION p1 VALUES IN (6,7,8,9,10) ); ALTER TABLE list_tab ADD PARTITION(PARTITION pd DEFAULT PARTITIONS 2); ADD LIST PARTITION LIST DEFAULT HASH分区表ALTER TABLE ADD PARTITION语法支持使用WITHOUT VALIDATION选项添加LIST分区。 ALTER TABLE table_name ADD PARTITION( list_partition_definition[, ..., list_partition_definition]) WITHOUT VALIDATION 新增一个LIST分区的示例如下: CREATE TABLE list_default_hash ( a INT, b INT ) PARTITION BY LIST (a) (PARTITION p0 VALUES IN (1,2,3,4,5), PARTITION p1 VALUES IN (6,7,8,9,10), PARTITION pd DEFAULT PARTITIONS 3); ALTER TABLE list_default_hash ADD PARTITION( PARTITION p2 VALUES IN (11,12,13) )WITHOUT VALIDATION; 执行后,list_default_hash表会增加一个LIST分区p2,p2中没有数据。 一旦使用了without validation添加list分区,需要您手动执行`ALTER TABLE .. REBUILD ALL`命令,重新分配数据。否则数据不会重新分配,满足新添加的分区定义的数据仍存放在DEFAULT分区中,在查询时候会把default分区全部标记,不会裁剪掉,会导致查询性能下降。建议您使用ALTER TABLE REORGANIZE PARTITION语法,从DEFAULT分区中分离部分数据,建立新的LIST分区。 ALTER TABLE DROP PARTITION DROP PARTITION操作时,只能一次性删除全部DEFAULT分区,不支持只删除部分DEFAULT分区。 执行DROP PARTITION操作,删除所有分区的示例如下: ALTER TABLE list_default_hash DROP PARTITION pd0,pd1,pd2; Query OK, 0 rows affected (0.33 sec) Records: 0 Duplicates: 0 Warnings: 0 单独删除部分DEFAULT分区时会报错。 ALTER TABLE list_default_hash DROP PARTITION pd0; 报错信息如下: ERROR 8078 (HY000): DROP PARTITION cannot be used on default partitions of LIST DEFAULT, except once dropping all default partitions ALTER TABLE REORGANIZE PARTITION REORGANIZE PARTITION操作时,只能一次性修改全部DEFAULT分区,不支持只修改部分DEFAULT分区。 使用REORGANIZE PARTITION操作可以改变DEFAULT分区的个数: ALTER TABLE list_default_hash REORGANIZE PARTITION pd0,pd1 INTO( PARTITION pd DEFAULT PARTITIONS 3); 执行后,DEFAULT分区的个数会由2个变成3个。 使用REORGANIZE PARTITION可以从DEFAULT分区中分离出一个LIST分区: ALTER TABLE list_default_hash REORGANIZE PARTITION pd0,pd1 INTO ( PARTITION p2 VALUES IN (20,21), PARTITION pd DEFAULT PARTITIONS 2); 执行后,list_default_hash分区表会增加一个LIST分区p2, p2中会有从DEFAULT分区中分离出来的符合VALUES IN (20,21)的数据。 使用REORGANIZE PARTITION可以合并一个LIST分区到DEFAULT分区 ALTER TABLE list_default_hash REORGANIZE PARTITION p2, pd0, pd1 INTO ( PARTITION pd DEFAULT PARTITIONS 2); 执行后,LIST分区p2会合并到DEFAULT分区里。 使用REORGANIZE PARTITION可以从DEFAULT分区中分离部分values放到LIST分区: ALTER TABLE list_default REORGANIZE partition p2, pd0, pd1 INTO ( PARTITION p2 VALUES IN (20,21,22,23,24), PARTITION pd DEFAULT PARTITIONS 4); 执行后,p2的定义由PARTITION p2 VALUES IN (20,21)变为PARTITION p2 VALUES IN (20,21,22,23,24), 相应的数据也会从DEFAULT分区挪到p2。
  • 参数说明 在参数配置页面通过设置参数rds_list_default_partition_enabled的值来启用或禁用LIST DEFAULT HASH功能。 表1 参数说明 参数名称 级别 说明 rds_list_default_partition_enabled Global LIST DEFAULT HASH功能控制开关。 取值范围如下: ON: 启用LIST DEFAULT HASH功能。 OFF: 关闭LIST DEFAULT HASH功能。
  • 创建LIST DEFAULT HASH分区表 语法 CREATE TABLE [ schema. ]table_name table_definition PARTITION BY LIST [COLUMNS] (expr) SUBPARTITION BY ... (list_partition_definition[, ..., list_partition_definition], default_partition_definition ) 其中,default_partition_definition为: PARTITION partition_name DEFAULT [PARTITIONS number] 每个分区的定义也可以包含二级分区, 二级分区也支持使用LIST DEFAULT分区,定义如下: SUBPARTITION subpartition_name DEFAULT 表2 参数说明 参数名称 参数说明 table_name 要创建的表名称。 partition_name 只有一个DEFAULT分区时,表示分区名称。不可与其他分区表重复。 当有多个DEFAULT分区时,表示分区名称前缀。“partition_name+序号”表示分区名称。 subpartition_name 子分区名称。同一个表中不可重复,子分区最多只支持一个DEFAULT分区。 number DEFAULT分区按照哈希规则分成number个分区,通过number指定分区个数。PARTITIONS number是可选项,不指定时,则默认为一个DEFAULT分区。 示例 创建单个DEFAULT分区示例如下: CREATE TABLE list_default_tbl ( a INT, b INT ) PARTITION BY LIST (a) (PARTITION p0 VALUES IN (1,2,3,4,5), PARTITION p1 VALUES IN (6,7,8,9,10), PARTITION pd DEFAULT); 创建多个DEFAULT分区示例如下: CREATE TABLE list_default_hash ( a INT, b INT ) PARTITION BY LIST (a) (PARTITION p0 VALUES IN (1,2,3,4,5), PARTITION p1 VALUES IN (6,7,8,9,10), PARTITION pd DEFAULT PARTITIONS 3); 使用LIST COLUMNS示例如下: CREATE TABLE t_goods ( country VARCHAR(30), year VARCHAR(60), goods TEXT ) PARTITION BY LIST COLUMNS(country) ( PARTITION p1 VALUES IN ('China'), PARTITION p2 VALUES IN ('USA'), PARTITION p3 VALUES IN ('Asia'), PARTITION p3 VALUES IN ('India'), PARTITION p_deft DEFAULT PARTITIONS 5 ); 通过explain查看分区: EXPLAIN SELECT * FROM list_default_hash; 显示结果如下: +----+-------------+-------------------+-------------------+------+---------------+------+---------+------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------------------+-------------------+------+---------------+------+---------+------+------+----------+-------+ | 1 | SIMPLE | list_default_hash | p0,p1,pd0,pd1,pd2 | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | NULL | +----+-------------+-------------------+-------------------+------+---------------+------+---------+------+------+----------+-------+ 1 row in set (0.04 sec) 二级分区支持LIST DEFAULT类型,示例如下: CREATE TABLE test (a int, b int) PARTITION BY RANGE(a) SUBPARTITION BY LIST(b) ( PARTITION part0 VALUES LESS THAN (10) ( SUBPARTITION sub0 VALUES IN (1,2,3,4,5), SUBPARTITION sub1 DEFAULT), PARTITION part1 VALUES LESS THAN (20) ( SUBPARTITION sub2 VALUES IN (1,2,3,4,5), SUBPARTITION sub3 DEFAULT), PARTITION part2 VALUES LESS THAN (30) ( SUBPARTITION sub4 VALUES IN (1,2,3,4,5), SUBPARTITION sub5 DEFAULT)); 一级分区存在多个LIST DEFAULT HASH分区的情况下,仅支持HASH或KEY二级分区: CREATE TABLE list_default_hash_sub ( a INT, b INT ) PARTITION BY LIST (a) SUBPARTITION BY HASH (b) SUBPARTITIONS 20 (PARTITION p0 VALUES IN (1,2,3,4,5), PARTITION p1 VALUES IN (6,7,8,9,10), PARTITION pd DEFAULT PARTITIONS 3);