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


8.11.3 同時挿入

MyISAM ストレージエンジンでは、特定のテーブルに対する読み取りと書き込みの競合を軽減するために、同時挿入をサポートしています。MyISAM テーブルのデータファイルに隙間 (途中の削除された行) がない場合、SELECT ステートメントがテーブルの行を読み取るのと同時に、INSERT ステートメントを実行してテーブルの末尾に行を追加できます。 複数の INSERT ステートメントがある場合、それらはキューに入れられ、SELECT ステートメントと同時に順番に実行されます。 同時 INSERT の結果はすぐに見られないことがあります。

concurrent_insert システム変数を設定して、同時挿入の処理を変更できます。 デフォルトで、変数は AUTO (または 1) に設定され、同時挿入が先述のように処理されます。 concurrent_insertNEVER (または 0) に設定されている場合、同時挿入は無効にされます。 変数が ALWAYS (または 2) に設定されている場合、行が削除されたテーブルに対してもテーブルの末尾での同時挿入が許可されます。 concurrent_insert システム変数の説明も参照してください。

バイナリログを使用している場合、同時挿入は CREATE ... SELECT または INSERT ... SELECT ステートメントの通常の挿入に変換されます。 これは、バックアップ操作中にログを適用することでテーブルの正確なコピーを確実に再作成できるようにするために行われます。 セクション5.4.4「バイナリログ」を参照してください。 また、これらのステートメントに対しては、選択元のテーブルへの挿入がブロックされるように、そのテーブルに読み取りロックが設定されます。 その結果、そのテーブルに対する同時挿入も待機する必要があります。

LOAD DATA では、同時挿入の条件を満たす MyISAM テーブルを使用して CONCURRENT を指定した場合 (つまり、中央に空きブロックが含まれていない場合)、他のセッションは LOAD DATA の実行中にテーブルからデータを取得できます。 CONCURRENT オプションの使用は、同時にテーブルを使用しているほかのセッションがない場合でも、LOAD DATA のパフォーマンスに多少の影響があります。

HIGH_PRIORITY を指定すると、サーバーが --low-priority-updates オプションで起動されている場合に、その効果がオーバーライドされます。 また、同時挿入も使用されなくなります。

LOCK TABLE の場合、READ LOCALREAD の違いは READ LOCAL が、ロックが保持されている間に、競合していない INSERT ステートメント (同時挿入) の実行を許可することです。 ただし、ロックを保持している間にサーバーの外部のプロセスを使用してデータベースを操作する場合、これを使用することはできません。


関連キーワード:  テーブル, 挿入, 同時, インデックス, InnoDB, ステートメント, ロック, 結合, リファレンス, クエリー