PolarDB支持在不做数据重分布的情况下,可以使用该语法快速的将普通表转为RANGE分区表。本文将介绍PolarDB普通表快速转RANGE分区表的操作步骤。
背景信息
PolarDB普通表快速转RANGE分区表时,普通表的数据不经校验直接作为分区表的第一个分区的数据,其他分区为空分区。PolarDB普通表快速转RANGE分区表通常用于想把历史数据放入第一个分区,同时避免使用普通的ALTER PARTITION BY
语法重写一遍数据,快速的将普通表转为RANGE分区表的场景。
如需了解更多关于普通表快速转换为RANGE分区表的内容,请搜索钉钉群号加群进行咨询。钉钉群号:24490017825。
前提条件
集群版本需为PolarDB MySQL版8.0.2版本且Revision version为8.0.2.2.10或以上。您可以通过查询版本号确认集群版本。
使用限制
若单表通过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分区表。
请务必保证普通表中的数据全部符合分区表第一个分区定义的边界,否则转成分区表之后,不符合分区规则的数据可能会查询不到。
组合使用语法
普通表快速转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秒 |