遅いクエリーを検出する②~ mysqldumpslowの活用
インデクスチューニングしようと、漠然と、tail -f mysqld-slow.log を確認しようと思ったら、ウチの会社に協力していただいている某社さんから、「もっと簡単に見れるツールがあるよ」といわれました。それが
mysqldumpslow
何それ?。。。
うそ!?こんなツールあったの?って本当に、mysqlは無知です。僕。DBMSという基礎の部分の考え方は、どんなDBMSであろうが大差はないのかと思っているのですが、細かい部分になると、やはりながくMySQLを使っている方に聞くのが一番だと実感しました。すごく勉強になりました。これからも色々聞こうっと、お返しには、db2を教えてあげよう(W
mysqldumpslowは、slow.logを、集計して、一番時間がかかっているクエリを出してくれます。ためしにこのサイトで 一番時間がかかっているクエリはなんなの?というのを調べたいときは、こんな感じで実行します。
# mysqldumpslow -s -t /var/lib/mysql/mysqld-slow.log | less まあ、ここのサイトは優秀なので(つか誰も見に来てないよ!)たいしたログはでてきませんでした、 Count: 2 Time=0.00s (0s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@WWW.s-QUAD.COM SELECT ID FROM wp_posts WHERE post_status = 'S' AND DATE_SUB( NOW(), INTERVAL N DAY ) > post_date 自分のところなんで参考ににならなくてもうしわけありませんが、ざっくりとは、COUNTが回数で、Timeがかかった秒数です。 ヘルプを参照したところ色々オプションがありまして細かく設定できそうですね。リアルタイムの監視ではなく、一週間まとめて、じっくりとチューニングしたいなんて場合はtail -fなんかしないでこちらで集計をとってやったほうがお勧めかも。
# mysqldumpslow --help Usage: mysqldumpslow [ OPTS... ] [ LOGS... ] Parse and summarize the MySQL slow query log. Options are --verbose verbose --debug debug --help write this text to standard output -v verbose -d debug -s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is default al: average lock time ar: average rows sent at: average query time c: count l: lock time r: rows sent t: query time -r reverse the sort order (largest last instead of first) -t NUM just show the top n queries -a don't abstract all numbers to N and strings to 'S' -n NUM abstract numbers with at least n digits within names -g PATTERN grep: only consider stmts that include this string -h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard), default is '*', i.e. match all -i NAME name of server instance (if using mysql.server startup script) -l don't subtract lock time from total time
# mysqldumpslow --help
Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]
Parse and summarize the MySQL slow query log. Options are
--verbose verbose
--debug debug
--help write this text to standard output
-v verbose
-d debug
-s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is default
al: average lock time
ar: average rows sent
at: average query time
c: count
l: lock time
r: rows sent
t: query time
-r reverse the sort order (largest last instead of first)
-t NUM just show the top n queries
-a don't abstract all numbers to N and strings to 'S'
-n NUM abstract numbers with at least n digits within names
-g PATTERN grep: only consider stmts that include this string
-h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard),
default is '*', i.e. match all
-i NAME name of server instance (if using mysql.server startup script)
-l don't subtract lock time from total time