PolarDB は並列 DDL 機能をサポートしています。データベースのハードウェアリソースがアイドル状態のときに並列 DDL を使用すると、DDL の実行を高速化し、後続の関連する DML 操作のブロッキングを回避し、DDL 操作の実行ウィンドウを短縮できます。
適用範囲
セカンダリインデックスを作成するには、PolarDB クラスターのバージョンが次のいずれかの条件を満たしている必要があります。
PolarDB for MySQL 8.0.2、リビジョンバージョン 8.0.2.1.7 以降。
PolarDB for MySQL 8.0.1、リビジョンバージョン 8.0.1.1.10 以降。
PolarDB for MySQL 5.7、リビジョンバージョン 5.7.1.0.7 以降。
プライマリキーインデックスを作成するには、PolarDB クラスターのバージョンが次のいずれかの条件を満たしている必要があります。
PolarDB for MySQL 8.0.2、リビジョンバージョン 8.0.2.2.9 以降。
PolarDB for MySQL 8.0.1、リビジョンバージョン 8.0.1.1.31 以降。
クラスターのバージョンの確認方法については、「Query the engine version」をご参照ください。
考慮事項
並列 DDL を有効にすると、並列スレッド数に応じて CPU、メモリ、I/O などのハードウェアリソースの消費が増加します。これにより、同時に実行される他の SQL 操作に影響する場合があります。並列スレッド数を多く設定すると、プロセスが使用するメモリ量も増加します。利用可能なメモリが不足している場合、メモリ不足 (OOM) エラーが発生してクラスターの安定性に影響する可能性があります。そのため、オフピーク時やハードウェアリソースが十分な場合に並列 DDL を使用してください。
制限事項
並列 DDL の高速化は、プライマリキーインデックスおよびセカンダリインデックスを作成する DDL 操作に対応しています (全文インデックス、空間インデックス、および仮想列上のセカンダリインデックスを除く)。
背景
従来の DDL 操作はシングルコアおよび従来型ハードディスクドライブを前提に設計されているため、大規模テーブルに対する DDL 操作は長時間を要し、レイテンシも過度に高くなります。たとえば、セカンダリインデックスを作成する際、レイテンシが過度に高い DDL 操作は、新しいインデックスに依存する後続の DML クエリ操作をブロックします。マルチコアプロセッサの発展により、並列 DDL がより多くのスレッドを使用するためのハードウェアサポートが提供されるようになり、ソリッドステートドライブ (SSD) の採用により、ランダムアクセスのレイテンシはシーケンシャルアクセスのレイテンシに近づきました。そのため、並列 DDL を使用して大規模テーブルのインデックス作成を高速化することが特に重要です。
使用方法
innodb_polar_parallel_ddl_threads
次の innodb_polar_parallel_ddl_threads パラメーターを使用して並列 DDL を有効にできます。
パラメーター
レベル
説明
innodb_polar_parallel_ddl_threads
セッション
各 DDL 操作の並列スレッド数です。有効値:1~16。デフォルト値:1。
このパラメーターの値が 1 以外の場合、セカンダリインデックスの作成時に並列 DDL が自動的に有効になります。
説明このパラメーターの値が 1 の場合、システムはデフォルトで 2 つの並列スレッドを有効にします。
innodb_parallel_build_primary_index
次の innodb_parallel_build_primary_index パラメーターを使用して、プライマリキーインデックス作成時に並列 DDL を許可するかどうかを制御できます。
説明並列プライマリキーインデックス作成機能を使用するには、クォータセンターに移動します。[クォータ ID] が [polardb_mysql_pddl_for_pk] である行を見つけ、[操作] 列で [申請] をクリックしてトライアルを申請します。
パラメーター
レベル
説明
innodb_parallel_build_primary_index
グローバル
プライマリキーインデックス作成時に並列 DDL を許可するかどうかを指定します。有効値:
ON:プライマリキーインデックス作成時に並列 DDL を許可します。
OFF:プライマリキーインデックス作成時に並列 DDL を許可しません (デフォルト)。
innodb_polar_use_sample_sort
並列 DDL の有効化だけでは要件を満たさない場合は、innodb_polar_use_sample_sort パラメーターを使用して、インデックス作成時に実行されるソート処理をさらに最適化できます。
パラメーター
レベル
説明
innodb_polar_use_sample_sort
セッション
サンプルソート最適化機能を有効にするかどうかを指定します。有効値:
ON:サンプルソート最適化機能を有効にします。
OFF:サンプルソート最適化機能を無効にします (デフォルト)。
innodb_polar_use_parallel_bulk_load
前述の機能でも要件を満たさない場合は、innodb_polar_use_parallel_bulk_load パラメーターを使用して、インデックスツリーの構築をさらに最適化することもできます。
パラメーター
レベル
説明
innodb_polar_use_parallel_bulk_load
セッション
並列バルクロード最適化機能を有効にするかどうかを指定します。有効値:
ON:並列バルクロード最適化機能を有効にします。
OFF:並列バルクロード最適化機能を無効にします (デフォルト)。
パフォーマンステスト
テスト環境
16 コア、128 GB のメモリを備えた PolarDB for MySQL 8.0 Standard Edition クラスター。
クラスターのストレージ容量は 50 TB です。
テストテーブルのスキーマ
次のステートメントを使用して、
t0という名前のテーブルを作成します:CREATE TABLE t0( a INT PRIMARY KEY, b INT) ENGINE=InnoDB;テストテーブルデータ
次のステートメントを使用してテストデータを生成します。
DELIMITER // CREATE PROCEDURE populate_t0() BEGIN DECLARE i int DEFAULT 1; WHILE (i <= $table_size) DO INSERT INTO t0 VALUES (i, 1000000 * RAND()); SET i = i + 1; END WHILE; END // DELIMITER ; CALL populate_t0() ;説明実際のテストでは、
$table_sizeを1000000などのテーブル内の実際のレコード数に置き換えます。このテストでは、1,000,000、10,000,000、100,000,000、1,000,000,000 件のレコードを含むテーブルと、1 TB のデータを含むテーブルを使用します。
1 TB のデータを含むテストテーブルは Sysbench を使用して生成します。Sysbench の使用方法の詳細については、「Test tools」をご参照ください。
テスト方法
このテストでは、innodb_polar_parallel_ddl_threads パラメーターを 1、2、4、8、16、32 に設定して並列スレッド数を変更し、データ量の異なるテーブルで並列 DDL を有効にして、データ型が
INTで名前がbのカラムにセカンダリインデックスを作成した場合の DDL 実行効率の向上率を測定します。テスト結果
次の図は、innodb_polar_parallel_ddl_threads パラメーターのみを有効にした場合の並列 DDL の高速化率を示します。

次の図は、innodb_polar_parallel_ddl_threads および innodb_polar_use_sample_sort パラメーターの両方を有効にした場合の並列 DDL の高速化率を示します。

次の図は、innodb_polar_parallel_ddl_threads、innodb_polar_use_sample_sort、および innodb_polar_use_parallel_bulk_load パラメーターを有効にした場合の並列 DDL の高速化率を示します。

お問い合わせ
DDL 操作についてご不明な点がある場合は、お問い合わせください。