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

PolarDB:DDL 多方向マージソート

最終更新日:Mar 29, 2026

大規模なテーブルに対してインデックスを作成すると、数分以上かかる場合があり、その間は同時実行可能な 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 つのフェーズで行われます。

  1. スキャン:クラスター化インデックスをスキャンし、ソートエントリをソートバッファーに書き込みます。バッファーが満杯になると、エントリはソート済みの ラン(run)として一時的な中間ファイルにフラッシュされます。

  2. マージソート:すべてのランが書き込まれた後、InnoDB がそれらをマージします。デフォルトの 2 方向ソートでは、2 つのランを一度にマージするため、中間ファイルを複数回通過する必要があります。N 方向マージでは、1 回のパスでより多くのランを結合するため、総通過回数および中間 I/O を削減できます。

  3. 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~162マージおよびソートの方向数です。デフォルト値の 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
CPU8 コア
メモリ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 操作に関するご質問がある場合は、テクニカルサポート までお問い合わせください。

関連トピック