うまいぼうぶろぐ

linuxとhttpdとperlのメモ

mysql MyISAM の同時insert (concurrent_insert) の条件


運用後からずっと、とある巨大なmyisam tableをmysqldump しているんだけど 突然 mysqldumpしている時間帯にinsertのlockが多発して同時接続数があふれるという現象にでくわした。(mysqldump のselect でlockかかっている)

あれ、でも同時insertが効くから別に大丈夫なんじゃないの?と疑問に思って document読んだら、concurrent_insert の変数とMyISAMのテーブルの状態次第で同時挿入が起きないということを知った。ウッ 勉強不足。

  • defualtのconcurrent_insert は1
    • このときのMyISAMテーブルがLOCK TABLES HOGE READ LOCAL でロックされている場合、
    • かつMyISAM テーブルに穴がない(末尾以外のレコードをdelete したことない) 状態だと同時挿入可能
    • テーブルの末尾にinsert されていく
  • 穴がある状態を解消する(デフラグする)方法は2つ
    • 1. OPTIMIZE TABLE する
    • 2. 真ん中のデータ部分が埋まるまでINSERTが実行されるのを待つ
  • concurrent_insert が0だと同時挿入しない
  • concurrent_insert が2だと強制的に同時挿入する
    • 間に削除されたレコードがあっても末尾に追加していく
    • 公式の英語のドキュメント読んだ感じ、ロックされている場合は末尾に、そうでない場合は空いているデータ部分に挿入するっぽい