MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  InnoDB テーブルの一括データロード

8.5.5 InnoDB テーブルの一括データロード

これらのパフォーマンスのヒントは、セクション8.2.5.1「INSERT ステートメントの最適化」の高速挿入の一般的なガイドラインを補足するものです。

  • InnoDB にデータをインポートする場合、自動コミットモードでは挿入のたびに、ディスクへのログのフラッシュを実行するため、それをオフにします。 インポート操作時に自動コミットを無効にするには、それを、SET autocommit ステートメントと COMMIT ステートメントで囲みます。

    SET autocommit=0;
    ... SQL import statements ...
    COMMIT;

    mysqldump オプション --opt は、それらを SET autocommit ステートメントと COMMIT ステートメントで囲まなくても、InnoDB テーブルに高速にインポートするダンプファイルを作成します。

  • 副キーに UNIQUE 制約がある場合、インポートセッション中に一意性チェックを一時的にオフにすることで、テーブルインポートを高速化できます。

    SET unique_checks=0;
    ... SQL import statements ...
    SET unique_checks=1;

    大きなテーブルの場合、InnoDB はその変更バッファを使用してセカンダリインデックスレコードをバッチで書き込むことができるため、これによりディスク I/O が大量に節約されます。 データに重複キーが含まれていないことを確認してください。

  • テーブルに FOREIGN KEY 制約がある場合、インポートセッションの間の外部キーチェックをオフにすることで、テーブルインポートを高速化できます。

    SET foreign_key_checks=0;
    ... SQL import statements ...
    SET foreign_key_checks=1;

    大きいテーブルの場合、これにより、大量のディスク I/O を節約できます。

  • 多くの行を挿入する必要がある場合、複数行 INSERT 構文を使用して、クライアントとサーバー間の通信オーバーヘッドを軽減します。

    INSERT INTO yourtable VALUES (1,2), (5,5), ...;

    このヒントは、InnoDB テーブルだけではなく、任意のテーブルへの挿入に有効です。

  • 自動増分カラムを含むテーブルに一括挿入を実行する場合は、innodb_autoinc_lock_mode を 1 (連続) ではなく 2 (インターリーブ) に設定します。 詳細は、セクション15.6.1.6「InnoDB での AUTO_INCREMENT 処理」 を参照してください。

  • 一括挿入を実行する場合は、PRIMARY KEY の順序で行を挿入する方が高速です。 InnoDB テーブルでは clustered index が使用されるため、PRIMARY KEY の順序で比較的高速にデータを使用できます。 PRIMARY KEY 順序での一括挿入の実行は、バッファプール内に完全に収まらないテーブルで特に重要です。

  • InnoDB FULLTEXT インデックスにデータをロードする場合の最高のパフォーマンスのため、次の一連のステップに従います。

    1. テーブル作成時に、FTS_DOC_ID_INDEX という一意のインデックスで、型 BIGINT UNSIGNED NOT NULL のカラム FTS_DOC_ID を定義します。 例:

      CREATE TABLE t1 (
      FTS_DOC_ID BIGINT unsigned NOT NULL AUTO_INCREMENT,
      title varchar(255) NOT NULL DEFAULT '',
      text mediumtext NOT NULL,
      PRIMARY KEY (`FTS_DOC_ID`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
      CREATE UNIQUE INDEX FTS_DOC_ID_INDEX on t1(FTS_DOC_ID);
    2. テーブルにデータをロードします。

    3. データがロードされたら、FULLTEXT インデックスを作成します。

    注記

    テーブル作成時に FTS_DOC_ID カラムを追加する場合、FTS_DOC_ID は各 INSERT または UPDATE によって単調に増分される必要があるため、FULLTEXT インデックス設定されたカラムが更新されたときに、FTS_DOC_ID カラムが更新されることを確認します。 テーブルの作成時に FTS_DOC_ID を追加せずに、InnoDB で DOC ID を管理する場合、InnoDB は、次の CREATE FULLTEXT INDEX コールで FTS_DOC_ID を非表示カラムとして追加します。 ただし、このアプローチでは、パフォーマンスに影響を与える可能性のあるテーブルの再構築が必要です。


関連キーワード:  テーブル, InnoDB, インデックス, ステートメント, データ, FTS, カラム, 挿入, 結合, クエリー