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