MySQLのslow query対応

MySQLのslow query対応

先日、運用中のシステムにおいて、Dailyバッチの完了後から
急にslow queryが発生し続けるというトラブルがありました。
もちろんデータが急に増えた訳ではありません。

explainでSlowLogの発生していたクエリを確認すると、通常
TBL_A -> TBL_Bの順に結合されていたクエリで、
TBL_B -> TBL_Aの結合順となっていました。
そして問題のクエリもexplain上では低コストでした。

どうやらDailyバッチで更新しているテーブルの統計情報が変に偏って作成された結果、
TBL_B -> TBL_Aの方が効率が良いと判断される状態になってしまったようです。

この場合ANALYZE TABLEすればその時点では解消するのですが、今回は再発を避けるため
「FROM TBL_A STRAIGHT_JOIN TBL_B」と、結合順を指定して回避しました。

InnoDBの統計情報はランダムに収集した情報を元に生成されるため100%正確ではなく、
同じデータであってもANALYZEの度に異なる統計情報が生成されるので、
急にパフォーマンスが劣化した時には統計情報の狂いも疑ってみましょう。

※同様に統計情報の狂いが原因で非効率なINDEXが使用されてしまう場合は
「FORCE INDEX」のHINTも有効です。

~参考~
http://dev.mysql.com/doc/refman/5.1/ja/innodb-restrictions.html
http://dev.mysql.com/doc/refman/5.1/ja/join.html

TAG

  • このエントリーをはてなブックマークに追加
福ちゃん
プロジェクトマネージャー 福ちゃん fukuchan

PM兼、SE兼、雑用係。 プログラムを書く機会はめっきり減ってしまったので、DBやインフラに関する記事を書いていきます。 子育て、筋トレ、資産運用、鳥取県のPRに関心があります。