MySQLのスロークエリを確認するまでの手順備忘録
アプリケーションを作るうえで、DBとのやり取りはほぼほぼ発生するかと思います。
その際に投げられるクエリたちについて、どれが時間がかかっているクエリ(スロークエリ)なのかを確認する方法となります。
スロークエリのON/OFFを確認する
下記コマンドにてスロークエリのON/OFFおよびログの出力先を確認します。
mysql> show variables like 'slow_query%';
+---------------------+--------------------------------------+
| Variable_name | Value |
+---------------------+--------------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/f715b6ca7431-slow.log |
+---------------------+--------------------------------------+
2 rows in set (0.01 sec)
閾値を確認
下記コマンドにてクエリがスローと判断される(ログが出力される)閾値を確認します。
mysql> show variables like 'long%';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)
スロークエリの設定
設定ファイルまたはmysqlコマンドで設定を行います。
設定ファイル(my.cnf)の場合
[mysqld]
slow_query_log_file=’/tmp/slow.log’
slow_query_log=1
long_query_time=0.5
コマンドで設定の場合
mysql>set global slow_query_log_file='/tmp/slow.log';
mysql>set global slow_query_log=1;
mysql>set global long_query_time=0.5;
ちなみにslow_query_log_file
に指定されたパスに対して mysqld の実行ユーザーが書き込み権限を持っていないとエラーになります
mysql> set global slow_query_log=1;
ERROR 29 (HY000): File '/var/log/mysql/slow.log' not found (OS errno 2 - No such file or directory)
スリークエリの集計
スロークエリの設定が完了したら、実際にクエリを投げてみます。
# 3秒スリープさせるクエリ
mysql> select sleep(3);
クエリ実行後、mysqldumpslow
コマンドを実行し集計結果を表示します。
mysqldumpslow
はクエリではなくコマンドになります。mysql内で実行はできません。
コマンドのオプションはこちらを参考にしてください。
$ mysqldumpslow -s t /tmp/slow.log
Reading mysql slow query log from /tmp/slow.log
Count: 1 Time=3.00s (3s) Lock=0.00s (0s) Rows=1.0 (1), root[root]@localhost
select sleep(N)
集計結果 | 概要 |
---|---|
Count | 実行回数 |
Time | 平均実行時間(累計) |
Lock | テーブルをロックした平均時間(累計) |
Rows | 操作したレコードの平均数(累計) |
まとめ
ここまででどのクエリが時間がかかっているかを確認できるようになりました。
次回はEXPLAINによるクエリ解析を行います。
→ EXPLAINを使ってクエリ解析