これらのパフォーマンスのヒントは、セクション8.2.2.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 に設定します。詳細は、セクション14.6.5.2「構成可能な InnoDB の自動インクリメントロック」を参照してください。-
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=latin1; 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
を非表示カラムとして追加します。ただし、このアプローチでは、パフォーマンスに影響するテーブルの再構築が必要になります。 -