Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


8.10.3 同時挿入

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

concurrent_insert システム変数を設定して、同時挿入の処理を変更できます。デフォルトで、変数は AUTO (または 1) に設定され、同時挿入が先述のように処理されます。concurrent_insertNEVER (または 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 LOCALREAD の違いは READ LOCAL が、ロックが保持されている間に、競合していない INSERT ステートメント (同時挿入) の実行を許可することです。ただし、ロックを保持している間にサーバーの外部のプロセスを使用してデータベースを操作する場合、これを使用することはできません。


User Comments
  Posted by Baron Schwartz on May 12, 2008
Note that "... concurrent inserts are converted to normal inserts for CREATE ... SELECT or INSERT ... SELECT statements" means these statements will NOT be compatible with concurrent inserts.

In other words, if someone runs INSERT INTO tbl2 SELECT * FROM tbl1, any inserts into tbl1 will block until the INSERT..SELECT is done, even if you would normally be able to insert concurrently into tbl1.

If you use mysqladmin debug to examine the locks, on a normal select from tbl1 you'll see this:

Locked - read Low priority read lock

But on INSERT..SELECT, you'll see this:

Read lock without concurrent inserts
Sign Up Login You must be logged in to post a comment.