PolarDB for MySQLPolarDB は、データを再配置することなく、非パーティションテーブルをレンジパーティションテーブルに迅速に変換できます。 このトピックでは、PolarDB を使用して変換する方法について説明します。
背景情報
PolarDBでは、非パーティションテーブルをレンジパーティションテーブルに変換すると、非パーティションテーブルのデータは検証なしで最初のパーティションに配置され、他のパーティションは空になります。PolarDBでは、この方法は通常、履歴データを最初のパーティションにアーカイブし、標準のALTER PARTITION BY構文で必要となるデータの書き換えを回避するために使用されるため、変換が高速になります。
適用範囲
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 パーティションテーブルに変換できません。
使用方法
構文と例
構文
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
RANGE COLUMNS パーティションで使用するパーティションキー列のリストです。式はサポートされていません。
RANGE (expr)
RANGE パーティション分割に使用される式。
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オプションを使用すると、非パーティションテーブルのすべてのデータが検証なしで最初のパーティションに移動されます。DDL ステートメントで指定されたパーティション境界が、非パーティションテーブルのすべてのデータと一致することを確認してください。
組み合わせ構文
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 では、ネイティブの MySQL 方式と比較して、非パーティションテーブルをレンジパーティションテーブルに変換する際にテーブルのメタデータのみを更新し、データの書き換えは行いません。この変換は 0.1 秒未満で完了します。ネイティブの MySQL 方式では、データの検証と書き換えを行う必要があり、データ量が増加するにつれて、より長い時間がかかります。
テーブルサイズ | 標準の MySQL | PolarDB構文と例 |
1 GB (6,001,215 行) | 52.24 秒 | 0.10 秒 |
10 GB (59,986,052 行) | 8 分 45.82 秒 | 0.07 秒 |