MyISAM
ストレージエンジンでは、特定のテーブルに対する読み取りと書き込みの競合を軽減するために、同時挿入をサポートしています。MyISAM
テーブルのデータファイルに隙間 (途中の削除された行) がない場合、SELECT
ステートメントがテーブルの行を読み取るのと同時に、INSERT
ステートメントを実行してテーブルの末尾に行を追加できます。 複数の INSERT
ステートメントがある場合、それらはキューに入れられ、SELECT
ステートメントと同時に順番に実行されます。 同時 INSERT
の結果はすぐに見られないことがあります。
concurrent_insert
システム変数を設定して、同時挿入の処理を変更できます。 デフォルトで、変数は AUTO
(または 1) に設定され、同時挿入が先述のように処理されます。 concurrent_insert
が NEVER
(または 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 LOCAL
と READ
の違いは READ LOCAL
が、ロックが保持されている間に、競合していない INSERT
ステートメント (同時挿入) の実行を許可することです。 ただし、ロックを保持している間にサーバーの外部のプロセスを使用してデータベースを操作する場合、これを使用することはできません。