全部產品
Search
文件中心

PolarDB:普通錶快速轉換為RANGE分區表

更新時間:Jul 06, 2024

PolarDB支援在不做資料重分布的情況下,可以使用該文法快速的將普通錶轉為RANGE分區表。本文將介紹PolarDB普通錶快速轉RANGE分區表的操作步驟。

背景資訊

PolarDB普通錶快速轉RANGE分區表時,普通表的資料不經校正直接作為分區表的第一個分區的資料,其他分區為空白分區。PolarDB普通錶快速轉RANGE分區表通常用於想把歷史資料放入第一個分區,同時避免使用普通的ALTER PARTITION BY文法重寫一遍資料,快速的將普通錶轉為RANGE分區表的情境。

說明

如需瞭解更多關於普通錶快速轉換為RANGE分區表的內容,請搜尋DingTalk群號加群進行諮詢。DingTalk群號: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秒