すべてのプロダクト
Search
ドキュメントセンター

PolarDB:非パーティションテーブルを範囲パーティションテーブルに変換する

最終更新日:Jun 19, 2025

PolarDB では、データを再配布することなく、非パーティションテーブルを範囲パーティションテーブルにシームレスに変換できます。このトピックでは、PolarDB で非パーティションテーブルを範囲パーティションテーブルに変換する方法について説明します。

背景情報

PolarDB が非パーティションテーブルを範囲パーティションテーブルに変換する場合、非パーティションテーブルのデータは検証なしで最初のパーティションに転送されます。他のパーティションは空のままになります。ほとんどの場合、この機能は PolarDB で使用され、ALTER PARTITION BY 文を使用してデータを書き直すことなく、履歴データを最初のパーティションに転送します。これにより、非パーティションテーブルを範囲パーティションテーブルにすばやく変換できます。

説明

非パーティションテーブルを範囲パーティションテーブルにすばやく変換する方法の詳細については、DingTalk グループ 24490017825 に参加してテクニカルサポートを受けてください。

前提条件

クラスタで PolarDB for MySQL 8.0.2 リビジョンバージョン 8.0.2.2.10 以降が実行されている必要があります。クラスタのバージョンの表示方法については、エンジンバージョン トピックの「エンジンバージョンのクエリ」セクションを参照してください。

制限

INSTANT ADD COLUMN 文を使用して追加されたフィールドが非パーティションテーブルに含まれている場合、テーブルを範囲パーティションテーブルに変換することはできません。

使用方法

非パーティションテーブルを範囲パーティションテーブルに変換する

構文

WITHOUT VALIDATION キーワードを [ALTER TABLE] 文に追加します。

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

パーティションキー列のリスト。式はサポートされていません。

RANGE(expr)

範囲パーティションに使用される式。

partition_name

パーティションの名前。

value_list

パーティションの値。

MAXVALUE

パーティションの最大値。

t1 非パーティションテーブルを範囲パーティションテーブルに変換します。

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 テーブルのすべてのデータは、検証なしで p0 パーティションに転送されます。非パーティションテーブルのすべてのデータが p0 パーティションの値の範囲内にあることを確認した場合は、この文を実行して非パーティションテーブルを範囲パーティションテーブルに変換できます。

説明
  • 非パーティションテーブルのすべてのデータが、パーティションテーブルの最初のパーティションの値の範囲内にあることを確認してください。そうでない場合、値の範囲を超えるデータは、テーブルがパーティションテーブルに変換された後に取得されない可能性があります。

  • WITHOUT VALIDATION オプションを使用する場合、システムは検証を実行せずに、非パーティションテーブルからすべてのデータを宛先パーティションテーブルの最初のパーティションに移動します。最初のパーティションの境界が、非パーティションテーブルのすべてのデータに対応するように定義されていることを確認してください。

他のパーティションテーブルでの使用方法

非パーティションテーブルを範囲パーティションテーブルに変換するための 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;

パフォーマンス

ネイティブ MySQL で非パーティションテーブルをパーティションテーブルに変換するために使用されるメカニズムと比較して、PolarDB で非パーティションテーブルをレンジパーティションテーブルに変換するために使用される機能は、テーブルのメタデータのみを変更し、テーブルデータを再書き込みしません。そのため、テーブルの変換には 0.1 秒未満しかかかりません。ネイティブ MySQL で非パーティションテーブルをパーティションテーブルに変換するために使用されるメカニズムでは、検証とデータの再書き込みが必要です。そのため、より長い時間がかかります。変換時間は、テーブルデータのサイズに基づいて増加します。

テーブルサイズ

ネイティブ MySQL

PolarDB

1 GB (6,001,215 行)

52.24 秒

0.10 秒

10 GB (59,986,052 行)

8 分 45.82 秒

0.07 秒