SHOW PROCESSLIST を使ったカジュアルなプロファイラを強化しました
KLab Advent Calendar 2011 「DSAS for Social を支える技術」の11日目です。
「SHOW FULL PROCESSLIST を使った MySQL のプロファイリング」 で紹介したプロファイラですが、 id:sh2 さんからはてブで
秒間10回叩く例も http://developer.cybozu.co.jp/kazuho/2009/07/mysql-539d.html 。変数ぽい部分をカットする処理はmysqldumpslowのコードを移植するといいかも
というコメントをいただきました。
そろそろネタに困っていたので、 せっかくなので、多くのユースケースで
便利に使えるように改良しました。ぜひご活用ください。
解説
クエリのサマライズ
前のバージョンでは = 以降をバッサリとカットしてしまっていたのですが、 例えば "WHERE user_id='xyz' AND enable=1" が "WHERE user_id=" になってしまうので、 問題のクエリを探すのが難しいケースがありました。
mysqldumpslow を参考にクエリのサマライズを改良し、 "WHERE user_id='S' AND enable=N" のような形式で集計できるようにしました。
ini形式のファイルからMySQLの設定を読み込むように
オプション無しで実行した場合、 ~/.my.cnf の [DEFAULT] セクションから user, password, host, port などを読み込みます。 (port はオプション)。
別のファイルから読み込むときは -c 設定ファイルパス でファイルを指定できます。
別のセクションから設定を読み込むときは -s セクション名 でセクション名を指定できます。
行数やインターバルを指定できるように
頻出する順で何件を表示するかを -n オプションで指定できるようにしました。
また、 show full processlist を実行する間隔を -i オプションで指定できます。 秒間10回サンプリングしたい場合は -i 0.1 と指定してください。
加工前のクエリを出力できるように
標準出力に表示しているクエリは、同じ形のクエリをまとめて集計するために 実際のパラメータ等が消えてしまっています。例えば LIMIT 100 でも LIMIT 5 でも LIMIT N と表示されてしまいます。
実際のパラメータを調べたり、 explain を実行するために、元のクエリが見えた 方がいいこともあるので、 -o 出力ファイル名 で、取得したクエリをファイルに 出力できるようにしました。
注意点
Python 2.6 以上で動くようにするつもりで書いていますが、自分の環境も
DSAS for Social も Python 2.7 を利用しているので Python 2.6 での動作は
未確認です。 (Python 2.5 以下は窓から投げ捨ててください)
(追記: Python 2.5 で使えない機能も避けました。未確認ですが使えるかもしれません)
MySQL への接続に MySQLdb を使っていますが、これは拡張ライブラリなので、 インストールには libmysqlclient のヘッダファイルや Python のヘッダファイルが 必要になります。 手軽にインストールしたい場合は、ピュアPythonの PyMySQL をインストールしてください。