MyISAM
ストレージエンジンでは、特定のテーブルに対する読み取りと書き込みの競合を軽減するために、同時挿入をサポートしています。MyISAM
テーブルのデータファイルに隙間 (途中の削除された行) がない場合、SELECT
ステートメントがテーブルの行を読み取るのと同時に、INSERT
ステートメントを実行してテーブルの末尾に行を追加できます。複数の INSERT
ステートメントがある場合、それらはキューに入れられ、SELECT
ステートメントと同時に順番に実行されます。同時 INSERT
の結果はすぐに見られないことがあります。
concurrent_insert
システム変数を設定して、同時挿入の処理を変更できます。デフォルトで、変数は AUTO
(または 1) に設定され、同時挿入が先述のように処理されます。concurrent_insert
が NEVER
(または 0) に設定されている場合、同時挿入は無効にされます。変数が ALWAYS
(または 2) に設定されている場合、行が削除されたテーブルに対してもテーブルの末尾での同時挿入が許可されます。concurrent_insert
システム変数の説明も参照してください。
同時挿入を使用できる状況下では、INSERT
ステートメントの DELAYED
修飾子を使用する必要はほとんどありません。セクション13.2.5.2「INSERT DELAYED 構文」を参照してください。
バイナリログを使用している場合、同時挿入は CREATE ... SELECT
または INSERT ... SELECT
ステートメントの通常の挿入に変換されます。これは、バックアップ操作中にログを適用することでテーブルの正確なコピーを確実に再作成できるようにするために行われます。セクション5.2.4「バイナリログ」を参照してください。また、これらのステートメントに対しては、選択元のテーブルへの挿入がブロックされるように、そのテーブルに読み取りロックが設定されます。その結果、そのテーブルに対する同時挿入も待機する必要があります。
LOAD DATA INFILE
で同時挿入の条件 (つまり、途中に空きブロックを含まない) を満たす MyISAM
テーブルを使用して CONCURRENT
を指定する場合、ほかのセッションは LOAD DATA
の実行中にテーブルからデータを取得できます。CONCURRENT
オプションの使用は、同時にテーブルを使用しているほかのセッションがない場合でも、LOAD DATA
のパフォーマンスに多少の影響があります。
HIGH_PRIORITY
を指定すると、サーバーが --low-priority-updates
オプションで起動されている場合に、その効果がオーバーライドされます。また、同時挿入も使用されなくなります。
LOCK TABLE
の場合、READ LOCAL
と READ
の違いは READ LOCAL
が、ロックが保持されている間に、競合していない INSERT
ステートメント (同時挿入) の実行を許可することです。ただし、ロックを保持している間にサーバーの外部のプロセスを使用してデータベースを操作する場合、これを使用することはできません。