PolarDB支持在不做数据重分布的情况下,可以使用该语法快速的将普通表转为RANGE分区表。本文将介绍PolarDB普通表快速转RANGE分区表的操作步骤。

前提条件

集群版本需为PolarDB MySQL版8.0.2版本且Revision version为8.0.2.2.10或以上。您可以通过查询版本号确认集群版本。

背景信息

PolarDB普通表快速转RANGE分区表时,普通表的数据不经校验直接作为分区表的第一个分区的数据,其他分区为空分区。PolarDB普通表快速转RANGE分区表通常用于想把历史数据放入第一个分区,同时避免使用普通的ALTER PARTITION BY语法重写一遍数据,快速的将普通表转为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_listLIST 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分区)和UNIQUE CHECK IGNORE(分区键可以选择主键和唯一键之外的字段)组合使用。

示例
create table t1(
 id int,
 date DATE,
 PRIMARY KEY (id)
);
ALTER TABLE t1 UNIQUE CHECK IGNORE=1
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秒