全部產品
Search
文件中心

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

更新時間:Aug 07, 2026

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

背景資訊

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

適用範圍

  • MySQL 8.0.2:修訂版本需為8.0.2.2.19及以上版本。

  • MySQL 8.0.1:修訂版本需為8.0.1.1.34及以上版本。

  • 若表上有INSTANT列或者列存索引(IMCI),則需要叢集版本為MySQL 8.0.2且修訂版本為8.0.2.2.36及以上版本。

您可以通過查詢版本號碼確認叢集版本。

使用限制

若單表通過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分區表。

    說明
    • 請務必保證普通表中的資料全部符合分區表第一個分區定義的邊界,否則轉成分區表之後,不符合分區規則的資料可能會查詢不到。

    • 當使用WITHOUT VALIDATION選項時,系統會將普通表的所有資料不經校正地遷移至目標資料分割的第一個分區地區。請確保DDL中指定的分區邊界是與普通表的全部資料匹配。

組合使用文法

普通錶快速轉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秒