実行に時間のかかるSQLを記録する

twitterにハマって1ヶ月も放置していたけれど、今日からまた再開。
現在SQLの最適化で絶賛悩み中。下手くそなSQLのせいで、100万件のデータを毎回全部読んでしまう。

コンソールから直接SQLを流して、平均2〜3秒。PHPのアプリ経由だと5秒以上かかる。

お話にならないので、色々最適化する方法を調べていたら、MySQLでは実行に時間のかかったSQLをログ記録してくれる「スロークエリログ」とかいう機能があるらしい。ので、早速設定。

;; my.cnfファイルを編集

[mysqld]

何だかんだ

log-slow-queries=/var/log/mysqld-slow.log
long-query-time=2
log-queries-not-using-indexes

実行時に「long-query-time」で設定した秒数以上かかったSQLを「/var/log/mysqld-slow.log」に記録してくれる。さらに、全件スキャンしてるSQLも記録してくれるそうなので、パフォーマンスの分析に役立つみたい。

閲覧時は、単純にlessやcatでも良いけど、

$ mysqldumpslow /path/to/slow_log

だと見やすく整形してくれるらしい。

こりゃ便利!!

だけど、どう最適化したらいいのかな〜(・x・ ).o0○