普通表快速转换为RANGE分区表

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秒