私には、ドキュメントは少し不明確です:
内部ロック方法 状況によっては、別のセッションがMyISAMテーブルから読み取っているときにMyISAMテーブルに挿入できることを示唆しています:
ただし、テーブルロックの問題 は、SELECTが完了するまでテーブルがロックされる状況を示しています(これは状況に適合します):
InnoDBテーブルは行レベルのロックを実装しているため、テーブル全体ではなく、読み取られている行のみがロックされます。
ドキュメントだけに頼るのではなく、少しテストしてみました:
- 同じ構造の2つのテーブルを作成します:
table_a
およびtable_b
。 -
table_a
に入力します 500,000行あります。 -
table_a
からデータをコピーしますtable_b
へINSERT INTO ... SELECT
を使用する ステートメント。 - コピープロセス中に、別のセッションを使用して新しい行を
table_a
に挿入します 。 -
table_b
かどうかを確認します 新しいレコードが含まれています。
両方のテーブルがMyISAMの場合、table_b
コピー後の新しいレコードは含まれていませんでした。両方のテーブルがInnoDBの場合、table_b
コピー後に新しいレコードが含まれていました。これを3回繰り返しましたが、予想通り、毎回同じ結果になりました。
つまり、テーブルがMyISAMの場合、テーブルはロックされます。 InnoDBの場合、そうではありません。もちろん、このテストでは更新は考慮されていませんが、結果は同様になると思います。