大規模なテーブルに対してインデックスを作成すると、数分以上かかる場合があり、その間は同時実行可能な DDL 操作がブロックされます。DDL 多方向マージソートは、デフォルトの 2 方向外部マージソートを N 方向ソートに置き換え、中間ファイルの読み書きサイクル回数を削減し、インデックス構築の合計時間を短縮します。
前提条件
開始前に、PolarDB クラスターが以下のいずれかのバージョン要件を満たしていることを確認してください。
PolarDB for MySQL 8.0.2(リビジョンバージョン 8.0.2.2.5 以降)
PolarDB for MySQL 8.0.1(リビジョンバージョン 8.0.1.1.28 以降)
PolarDB for MySQL 5.7(リビジョンバージョン 5.7.1.0.23 以降)
クラスターのバージョンを確認するには、「エンジンバージョンの照会」をご参照ください。
仕組み
InnoDB におけるインデックス作成は、以下の 3 つのフェーズで行われます。
スキャン:クラスター化インデックスをスキャンし、ソートエントリをソートバッファーに書き込みます。バッファーが満杯になると、エントリはソート済みの ラン(run)として一時的な中間ファイルにフラッシュされます。
マージソート:すべてのランが書き込まれた後、InnoDB がそれらをマージします。デフォルトの 2 方向ソートでは、2 つのランを一度にマージするため、中間ファイルを複数回通過する必要があります。N 方向マージでは、1 回のパスでより多くのランを結合するため、総通過回数および中間 I/O を削減できます。
B ツリーへの挿入:完全にソートされたエントリが B ツリーインデックスに挿入されます。
マージ方向数を増加させると、中間ファイルの通過回数が減少しますが、その代わりにメモリ使用量が増加します。追加の各方向につき、innodb_sort_buffer_size バイト分の追加ソートバッファーが必要になります。
制限事項
全文検索インデックスおよび空間インデックスはサポートされていません。
メモリ使用量はマージ方向数に比例して増加します。N 方向マージを有効化すると、クラスターの占有メモリサイズが
(N+1) × innodb_sort_buffer_sizeバイト分増加します。
多方向マージの設定
DDL 文を実行する前に、セッションレベルで innodb_polar_parallel_merge_ways を設定します。
| パラメーター | スコープ | 有効値 | デフォルト値 | 説明 |
|---|---|---|---|---|
innodb_polar_parallel_merge_ways | セッション | 2~16 | 2 | マージおよびソートの方向数です。デフォルト値の 2 では標準の 2 方向マージが使用されます。2 より大きい値を設定することで、多方向マージを有効化できます。 |
この設定は現在のセッションのみに適用され、セッション終了後にデフォルト値に戻ります。
例:8 方向マージを有効化し、大規模なテーブルにインデックスを作成します。
SET innodb_polar_parallel_merge_ways = 8;
ALTER TABLE table_1 ADD INDEX name_index (seller_name);パフォーマンステスト
以下のテストでは、1 億行のテーブルを対象に 2 方向マージと 8 方向マージを比較し、マージ方向数の増加による影響を示します。
テスト環境
| 項目 | 仕様 |
|---|---|
| クラスター | PolarDB for MySQL 8.0 |
| CPU | 8 コア |
| メモリ | 32 GB |
| ストレージ容量 | 50 TB |
スキーマ
CREATE TABLE `table_1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`seller_id` bigint(20) DEFAULT NULL,
`seller_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`gmt_create` varchar(30) DEFAULT NULL,
`update_time` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;テストデータ:以下のストアドプロシージャを使用して生成した 1 億行のデータです。
delimiter ||
CREATE PROCEDURE populate_0(IN NUM INT)
BEGIN
DECLARE sid INT;
DECLARE suffix_name INT;
DECLARE i INT;
SET sid=1000;
SET suffix_name=10;
SET i=1;
START TRANSACTION;
WHILE i <= NUM
DO
INSERT INTO table_1(seller_id, seller_name, gmt_create, update_time)
VALUES(sid, CONCAT('sellername', suffix_name), NOW(), NOW());
SET suffix_name=suffix_name+1;
SET sid=sid+1;
SET i=i+1;
END WHILE;
COMMIT;
END ||
delimiter ;
CALL populate_0(100000000);テスト操作:ALTER TABLE table_1 ADD INDEX name_index (seller_name);
結果
| 構成 | 時間(秒) |
|---|---|
| 8 ウェイマージおよびソート | 353 |
| 2 方向マージおよびソート | 485 |
このデータセットおよびハードウェア構成において、8 方向マージは 2 方向マージと比較して、インデックス作成時間を約 27 % 短縮しました。
お問い合わせ
DDL 操作に関するご質問がある場合は、テクニカルサポート までお問い合わせください。