- http://www.kinusati.net/2011/01/27/mysql%E3%81%8A%E5%8B%89%E5%BC%B7%E3%83%A1%E3%83%A2myisam%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3/
- http://dev.mysql.com/doc/refman/5.1/ja/concurrent-inserts.html
- http://dev.mysql.com/doc/refman/5.1-olh/ja/concurrent-inserts.html
- http://dev.mysql.com/doc/refman/5.1/ja/internal-locking.html
- http://dev.mysql.com/doc/refman/5.1/ja/server-system-variables.html#optvar_concurrent-insert
- http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_concurrent_insert
運用後からずっと、とある巨大なmyisam tableをmysqldump しているんだけど 突然 mysqldumpしている時間帯にinsertのlockが多発して同時接続数があふれるという現象にでくわした。(mysqldump のselect でlockかかっている)
あれ、でも同時insertが効くから別に大丈夫なんじゃないの?と疑問に思って document読んだら、concurrent_insert の変数とMyISAMのテーブルの状態次第で同時挿入が起きないということを知った。ウッ 勉強不足。
- defualtのconcurrent_insert は1
- 穴がある状態を解消する(デフラグする)方法は2つ
- 1. OPTIMIZE TABLE する
- 2. 真ん中のデータ部分が埋まるまでINSERTが実行されるのを待つ
- concurrent_insert が0だと同時挿入しない
- concurrent_insert が2だと強制的に同時挿入する
間に削除されたレコードがあっても末尾に追加していく- 公式の英語のドキュメント読んだ感じ、ロックされている場合は末尾に、そうでない場合は空いているデータ部分に挿入するっぽい