アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

テーブルの再構築

MySQLの話。

いつもは速いクエリが突然やたらと遅くなったので調べてみると、何故か適切なインデックスが使用されなくなっていた模様。
とりあえずインデックスを一旦削除して張り直すと戻りました。
(FORCE INDEX なんかも知ってはいますが、リリース済みのコードを直すのは(社内的に)面倒なので)

アホみたいにレコード数の多いテーブルなので定期メンテナンスできないか調べたところ、どうも空の ALTER TABLE を発行すると良さそう。

ALTER TABLE `テーブル名` ENGINE エンジン;

参考
nippondanji.blogspot.jp

とりあえず開発環境の同一構成テーブル(InnoDB、インデックスは11個)で試してみたところ、
約4万件に対して約2.8秒。

ちなみに本番環境は約500万件なので、同一構成のテーブルをもう一つ作成し
テストレコードをそのくらい入れて試してみたところ、15分。
結構きますね。

さらに全く別のテーブルでも試してみました。
約56万件、MyISAM、フルテキストインデックスあり。
1レコードあたりのサイズが大きい上に、フルテキストインデックスということでやはりかなりの時間がかかるようで
2時間近くかかりました。

…ということで定期メンテナンスが導入されたのですが、
空ALTERを発行することで逆に適切なインデックスが使われなくなってしまう箇所があり、
そこだけ一旦削除→再作成というステップを踏む羽目になっているのでした。なんでや。