とにもかくにも、何はともかく、slow query退治は大事である。ほっとくと、DBサーバがあっという間にアップアップしてしまう。
作ってしまった後に、手を入れると絶対に大変だし、MySQL慣れしてない人が書いたクエリなんかもちゃんと指摘しないといけないし、いろいろとあるので、プロジェクト開始直後から厳しく、綿密にチェックする必要がある。
確認
mysql -u root
で入り
show variables like 'slow%';
show variables like 'long%';
設定
mysql -u root
で入り
set global log_output = 'TABLE';
set global long_query_time = 0.3;
set global slow_query_log = ON;
私は出力先がTABLEのほうがいろいろツブシがきいて好きなのだが、ファイルにする場合にはパスなどもあわせて設定すること。
long_query_time
を0
に指定すると全部slow query扱いになる。0.3
という指定もここでは独断と偏見でしているが、プロジェクトの要求仕様に応じても最初から厳しい値にしておいたほうがいい。0.1
とか。
見る
select * from mysql.slow_log order by start_time desc limit 10
などすれば、どんなクエリが遅かったのかを確認できる。
muninで見張る
mysqlのプラグインがあるので見張る。とても便利。サンプルとして2枚ばかり貼る。
前述した見る、だと、どうしても手間がかかるので、本番が近くなってくると、こういうので確認し、つぶしていくとよい。
運用が始まったら始まったで、DBが原因で遅いのか?など確認できて非常に便利。
解決方法
- ほとんどindexチューンで問題無いことが多い。
- 次はメモリが足りない、とか、insertが遅い、とかになるが、これはスケールアップするか、マルチマスタを検討する。(筆者はマルチマスタは経験がない)
- lock_timeが大きくなる場合には、read replicationを増やすことをやらないと解決できないことが多い。
- 例えば、DBをケチって集計cron参照先と運用が同じDBの場合など、こうなることが多い。