MySQL道普請便り

第9回 pt-query-digestを使って遅いクエリーを発見する

この記事を読むのに必要な時間:およそ 5 分

遅いクエリーの調査をしてみようとして,実運用環境でスロークエリーログを出力してみたところ,思っていたよりもたくさん出力されていしまい,もはや何が起こっているのかわからなくなってしまうことはありませんか? スロークエリーログにいくら有益な情報が入っているとはいえ,数が多くなってしまうと一個一個確認していくのには気が遠くなるような時間と根気が必要となってしまいます。せっかくのIT技術を使っているのに人手による努力はなるべく避けたいものです。ということで大変なスロークエリーログの集計はPCやサーバにやってもらうことにしましょう。

そこで今回は,PERCONA社が公開しているPercona Toolkitのうちの,MySQLのクエリーから統計を取って教えてくれるpt-query-digestというコマンドツールについて説明をしていきます。

デモンストレーション環境

今回使用する環境は第7回 スロークエリーログを使って遅いクエリーを収集するで使用した環境を使用しております。

そのままだとスロークエリーログが1件しか無いため,前回出力したスロークエリーログを一旦削除して,以下のクエリーを実行して3件のスロークエリーログを追加してあります。

mysql> use zipcode
mysql> SELECT COUNT(*) FROM zipcode WHERE city='渋谷区' AND prefecture='東京都';
mysql> SELECT COUNT(*) FROM zipcode WHERE old_zipcode = '150';
mysql> SELECT COUNT(*) FROM zipcode WHERE old_zipcode = '150';

クエリーの実行後に,設定ファイルに記載した場所にあるスロークエリーログを確認して見ましょう。スロークエリーログを表示させた時に,以下のように3件のクエリーが表示されていれば問題ありません。

$ cat slow_query.log
/usr/local/Cellar/mysql/5.7.9/bin/mysqld, Version: 5.7.9-log (Homebrew). started with:
Tcp port: 0  Unix socket: (null)
Time                 Id Command    Argument
# Time: 2015-12-13T23:35:01.773062Z
# User@Host: root[root] @ localhost []  Id:     2
# Query_time: 0.060026  Lock_time: 0.000231 Rows_sent: 1  Rows_examined: 123864
use zipcode;
SET timestamp=1450049701;
SELECT COUNT(*) FROM zipcode WHERE city='渋谷区' AND prefecture='東京都';
# Time: 2015-12-13T23:35:07.206790Z
# User@Host: root[root] @ localhost []  Id:     2
# Query_time: 0.044150  Lock_time: 0.000093 Rows_sent: 1  Rows_examined: 123864
SET timestamp=1450049707;
SELECT COUNT(*) FROM zipcode WHERE old_zipcode = '150';
# Time: 2015-12-13T23:35:13.042779Z
# User@Host: root[root] @ localhost []  Id:     2
# Query_time: 0.051086  Lock_time: 0.000093 Rows_sent: 1  Rows_examined: 123864
SET timestamp=1450049713;
SELECT COUNT(*) FROM zipcode WHERE old_zipcode = '150';

このように3件のスロークエリーログではありますが,ログとしてかなりの量が出力さていることがわかると思います。特に実運用環境でスロークエリーログを出力した場合には,1時間に1000件以上表示されてしまうこともあります。そのためスロークエリーログを直接見て,どの遅いクエリーがたくさん呼ばれているかを判断することは難しくなります。

そこで次からは,このスロークエリーログやtcpdumpなどから統計情報が取得することができるpt-query-digestが含まれているPercona Toolkitをインストールして行きます。

Percona Toolkitをインストールする

Percona Toolkitとは

Percona ToolkitとはMySQL互換のデータベース,Percona Serverを開発しているPercona社が公開しているMySQLやその他の互換DBの運用管理を便利にしてくれるコマンドラインツール群です。

今回はそのうちの1つであるpt-query-digestについて取り上げますが,その他にもたくさんの便利なコマンドラインツールが用意されてます。他にどのようなツールがあるか気になる方は公式のPercona Toolkit Documentationを読んでみると良いと思います。

Percona Toolkitをインストール方法はOS毎にさまざまなものがあるのですが,ここでは代表的なものを上げておきます。現在Windows上でPercona Toolkitを動かす方法が無いため,Windowsをご利用の方は仮想環境やサーバを用意して,その上で試してみてください。

また,pt-query-digestを使う時の注意点としては統計を取る対象の件数が増えてくると,計算に時間がかかってしまったり,CPUを100%使いきってしまうことがあります。ぜひCPUを使いきっても問題にならないように,実運用環境以外のサーバやクライアントで実行するようにしましょう。

Mac OS X

Mac OS Xにインストールする場合は,Homebrewを使用している場合は以下のコマンドで簡単にインストールすることができます。

$ brew install percona-toolkit
==> Downloading https://homebrew.bintray.com/bottles/percona-toolkit-2.2.14.yosemite.bottle.2.tar.gz
######################################################################## 100.0%
==> Pouring percona-toolkit-2.2.14.yosemite.bottle.2.tar.gz
🍺  /usr/local/Cellar/percona-toolkit/2.2.14: 127 files, 7.0M

上記のように表示され,インストールが完了します。

Linux(CentOS)

公式に書かれている説明されているインストールガイドに従ってyumレポジトリを追加して,Percona Toolkitをインストールします。

$ yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm 
$ yum install -y percona-toolkit

Installed:
  percona-toolkit.noarch 0:2.2.16-1                                                                                                                          

Dependency Installed:
  perl-DBD-MySQL.x86_64 0:4.013-3.el6   perl-IO-Socket-SSL.noarch 0:1.31-2.el6      perl-Net-LibIDN.x86_64 0:0.12-3.el6 perl-Net-SSLeay.x86_64 0:1.35-9.el6
  perl-TermReadKey.x86_64 0:2.30-13.el6 perl-Time-HiRes.x86_64 4:1.9721-141.el6_7.1

Complete!

上記のように表示され,インストールは完了します。

著者プロフィール

木村浩一郎(きむらこういちろう)

GMOメディア株式会社 技術推進室所属のWebアプリケーションエンジニア。最近はミドルウェア・インフラ周りのことも少しずつ学習しています。趣味は将棋。好きな戦法は四間飛車。

Twitter:@kk2170

コメント

コメントの記入