これらのパフォーマンスのヒントは、セクション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
インデックスにデータをロードする場合の最高のパフォーマンスのため、次の一連のステップに従います。-
テーブル作成時に、
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);
テーブルにデータをロードします。
データがロードされたら、
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
を非表示カラムとして追加します。 ただし、このアプローチでは、パフォーマンスに影響を与える可能性のあるテーブルの再構築が必要です。 -