PolarDB支持在不做数据重分布的情况下,可以使用该语法快速的将普通表转为RANGE分区表。本文将介绍PolarDB普通表快速转RANGE分区表的操作步骤。
背景信息
PolarDB普通表快速转RANGE分区表时,普通表的数据不经校验直接作为分区表的第一个分区的数据,其他分区为空分区。PolarDB普通表快速转RANGE分区表通常用于想把历史数据放入第一个分区,同时避免使用普通的ALTER PARTITION BY语法重写一遍数据,快速的将普通表转为RANGE分区表的场景。
适用范围
MySQL 8.0.2:修订版本需为8.0.2.2.19及以上版本。
MySQL 8.0.1:修订版本需为8.0.1.1.34及以上版本。
若表上有
INSTANT列或者列存索引(IMCI),则需要集群版本为MySQL 8.0.2且修订版本为8.0.2.2.36及以上版本。
您可以通过查询版本号确认集群版本。
使用限制
若单表通过INSTANT ADD COLUMN语句添加过字段,则不能将其转为RANGE分区表。
使用说明
普通表快速转RANGE分区表
语法
在ALTER TABLE语句中添加
WITHOUT VALIDATION关键字。ALTER TABLE table_name PARTITION BY RANGE {(expr) | COLUMNS(column_list)} (partition_definition [, partition_definition] ...) WITHOUT VALIDATION;其中,
partition_definition如下:PARTITION partition_name VALUES LESS THAN {(value | value_list) | MAXVALUE}参数说明
参数
参数说明
table_name
表名称。
column_list
LIST COLUMNS类型使用,分区字段列表,不支持表达式。
RANGE(expr)
RANGE分区字段表达式。
partition_name
分区名称。
value_list
字段的边界值。
MAXVALUE
最大值。
示例
将普通表
t1转为RANGE分区表。CREATE TABLE t1 ( `a` int , `b` int , Primary Key(a, b)); insert into t1 values(1,1),(2,1),(3,1),(4,1),(111,111),(3333,333); alter table t1 partition by range(a) ( partition p0 values less than (100), partition p1 values less than (200) ) WITHOUT VALIDATION;t1表的所有数据会不经校验的全部转到partition p0,如果您确认普通表的数据全部符合p0定义的边界,可以使用该语法快速的进行普通表快速转RANGE分区表。说明请务必保证普通表中的数据全部符合分区表第一个分区定义的边界,否则转成分区表之后,不符合分区规则的数据可能会查询不到。
当使用WITHOUT VALIDATION选项时,系统会将普通表的所有数据不经校验地迁移至目标分区的第一个分区区域。请确保DDL中指定的分区边界是与普通表的全部数据匹配。
组合使用语法
普通表快速转RANGE分区表WITHOUT VALIDATION可以搭配INTERVAL分区表(自动创建相同间隔的RANGE分区)组合使用。示例如下:
CREATE TABLE t1(
ID int,
DATE DATE,
PRIMARY KEY (ID,DATE)
);
ALTER TABLE t1
partition by RANGE COLUMNS(date) INTERVAL(DAY, 1) (
PARTITION p0 VALUES LESS THAN ('2023-01-31')
) without validation;性能对比
PolarDB普通表快速转RANGE分区表相对于原生MySQL普通表转分区表功能,只改变表的元数据,不涉及到表数据的重写,所以速度非常快,耗时大约不到0.1秒。而原生MySQL普通表转分区表功能则需要校验并重写数据,耗时较长,且随数据量的增加耗时会变长。
表大小 | 原生MySQL普通表转分区表 | PolarDB普通表快速转RANGE分区表 |
1 GB (6001215 rows) | 52.24秒 | 0.10秒 |
10 GB (59986052 rows) | 8分钟45.82秒 | 0.07秒 |