9
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

スロークエリの見つけ方

Last updated at Posted at 2022-08-18

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を使ってクエリ解析

9
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?