挿入の速度を最適化するには、多くの小さな操作を 1 つの大きな操作に組み合わせます。 理想的には、単一の接続を作成し、多くの新しい行のデータを一度に送信し、すべてのインデックスの更新と一貫性チェックを最後まで延期します。
行の挿入に必要な時間は、次の要因によって決まります。ここでの数はおよその割合を示しています。
接続: (3)
サーバーへのクエリーの送信: (2)
クエリーの解析: (2)
行の挿入: (1 ×行サイズ)
インデックスの挿入: (1 ×インデックス数)
クローズ: (1)
これには、テーブルを開く初期オーバーヘッドを考慮に入れていません。これは同時実行クエリーごとに 1 回実行されます。
テーブルのサイズによって、log N
だけインデックスの挿入が遅くなります (B ツリーインデックスであるとして)。
次の方法を使用して、挿入を高速化できます。
同じクライアントから同時に多数の行を挿入する場合は、複数の
VALUES
リストでINSERT
ステートメントを使用して、同時に複数の行を挿入します。 これは、個別の単一行のINSERT
ステートメントを使用するより、大幅に (場合によっては数倍) 速くなります。 空ではないテーブルにデータを追加する場合は、データの挿入をさらに速くするために、bulk_insert_buffer_size
変数を調整できます。 セクション5.1.8「サーバーシステム変数」を参照してください。テキストファイルからテーブルをロードする場合は、
LOAD DATA
を使用します。 通常、これはINSERT
ステートメントを使用する場合より、20 倍速くなります。 セクション13.2.7「LOAD DATA ステートメント」を参照してください。カラムにデフォルト値があることを利用します。 挿入する値がデフォルト値と異なる場合にのみ、明示的に値を挿入します。 これにより、MySQL が実行する必要がある解析が減り、挿入速度が向上します。
InnoDB
テーブルに固有のヒントについては、セクション8.5.5「InnoDB テーブルの一括データロード」を参照してください。MyISAM
テーブルに固有のヒントについては、セクション8.6.2「MyISAM テーブルの一括データロード」を参照してください。