これらのパフォーマンスのヒントは、セクション8.2.5.1「INSERT ステートメントの最適化」の高速挿入の一般的なガイドラインを補足するものです。
MyISAM
テーブルでは、データファイルの途中に削除された行がない場合、SELECT
ステートメントの実行中に同時に、同時挿入を使用して行を追加できます。 セクション8.11.3「同時挿入」を参照してください。-
一部の追加作業では、テーブルに多数のインデックスがある場合に、
MyISAM
テーブルに対してLOAD DATA
をさらに高速に実行できます。 次の手順を使用します。FLUSH TABLES
ステートメントまたは mysqladmin flush-tables コマンドを実行します。テーブルのインデックスのすべての使用を削除するには、myisamchk --keys-used=0 -rq
/path/to/db/tbl_name
を使用します。LOAD DATA
を使用してテーブルにデータを挿入します。 これはインデックスを更新しないため、非常に高速です。今後、テーブルから読み取りだけをする場合は、myisampack を使用してそれを圧縮します。 セクション16.2.3.3「圧縮テーブルの特徴」を参照してください。
myisamchk -rq
/path/to/db/tbl_name
を使用してインデックスを再作成します。 これにより、ディスクに書き込む前にメモリーにインデックスツリーが作成されます。これは、多くのディスクシークが回避されるため、LOAD DATA
中にインデックスを更新するよりはるかに高速です。 結果のインデックスツリーは完全にバランスも取れています。FLUSH TABLES
ステートメントまたは mysqladmin flush-tables コマンドを実行します。
データを挿入する
MyISAM
テーブルが空の場合、LOAD DATA
は前述の最適化を自動的に実行します。 自動最適化とプロシージャの明示的な使用の主な違いは、LOAD DATA
ステートメントの実行時にサーバーがインデックスの再作成に割り当てることができるよりも多くの一時メモリーを myisamchk でインデックス作成に割り当てることができることです。myisamchk の代わりに次のステートメントを使用して、
MyISAM
テーブルの一意でないインデックスを無効または有効にすることもできます。 これらのステートメントを使用する場合は、FLUSH TABLES
操作をスキップできます:ALTER TABLE tbl_name DISABLE KEYS; ALTER TABLE tbl_name ENABLE KEYS;
-
非トランザクションテーブルに対して、複数ステートメントで実行される
INSERT
操作を高速化するには、テーブルをロックします。LOCK TABLES a WRITE; INSERT INTO a VALUES (1,23),(2,34),(4,33); INSERT INTO a VALUES (8,26),(6,29); ... UNLOCK TABLES;
これは、すべての
INSERT
ステートメントの完了後に、インデックスバッファーが 1 回だけディスクにフラッシュされるため、パフォーマンスにメリットがあります。 通常は、INSERT
ステートメントの数と同じだけ、インデックスバッファーのフラッシュが行われます。 すべての行を 1 つのINSERT
で挿入できる場合は、明示的なロックステートメントは必要ありません。ロックは複数接続テストの合計時間も短縮しますが、個々の接続がロックを待機するため、それらの最大待機時間は長くなることがあります。 次のように 5 台のクライアントが同時に挿入の実行を試みるとします。
接続 1 は 1000 回の挿入を実行します
接続 2、3、および 4 は 1 回の挿入を実行します
接続 5 は 1000 回の挿入を実行します
ロックを使用しない場合、接続 2、3、および 4 は 1 と 5 の前に終了します。 ロックを使用した場合、接続 2、3、および 4 は 1 または 5 の前に終了しない可能性がありますが、合計時間は約 40% 高速化するはずです。
MySQL では、
INSERT
、UPDATE
、およびDELETE
操作はきわめて高速ですが、約 5 回超の連続した挿入や更新を実行するすべての操作の周囲にロックを追加することによって、全体のパフォーマンスを向上できます。 著しく多くの連続した挿入を実行する場合、LOCK TABLES
のあとにときどき (1,000 行程度ごとに)UNLOCK TABLES
を実行して、ほかのスレッドのテーブルへのアクセスを許可できます。 これによってもパフォーマンスの向上が得られます。INSERT
では、前述の戦略を使用している場合でも、データのロードはLOAD DATA
よりもはるかに遅くなります。 MyISAM
テーブルのパフォーマンスを向上させるには、LOAD DATA
とINSERT
の両方について、key_buffer_size
システム変数を増やしてキーキャッシュを拡大します。 セクション5.1.1「サーバーの構成」を参照してください。