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秒 |