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