[MySQL]実行が遅いSQL命令(スロークエリ)を見つける

mysql_logo_large

この記事には広告を含む場合があります。

記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

スロークエリを出力して原因を調査する

ウェブページの表示が遅いとき、もっとも多い原因となるのは SQL の実行に時間がかかっている可能性です。今回は実行が遅い SQL を見つける方法であるスロークエリの使い方をお伝えいします。

 

スロークエリーの出力設定

スロークエリーを確認したいときは、MySQL の設定ファイルである my.cnf にスロークエリー(実行が遅いsql)を出力する設定を行います。Linux の OS により設定ファイルのパスは差異がある可能性がありますが、/etc/my.cnf であることが多いです。

スロークエリの出力設定を行ったサンプル

[root@localhost]# cat my.cnf                                                                                                                                                      
[mysqld]
(省略)
long_query_time=1
log-slow-queries=/var/log/mysql-slow.log

[mysqld_safe]
(省略)
[mysqld]の項目の末尾に設定を追加します。

long_query_time 実行時間が何秒以上を出力対象にするか
log-slow-queries ログファイルの出力パス

※long_query_timeは、mysql5.1から1秒未満(0.1など)の設定が可能です。

MySQL 設定ファイルの変更後には、mysql の再起動を行う必要があります。

[root@localhost]# service mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

 

実行する全てのsql命令を出力する

スロークエリーの設定を応用して、実行した全ての sql をログ出力することができます。

設定方法は「long_query_time = 0」を設定するだけです。主な利用用途として、開発に携わっていないWeb開発プロジェクトのページの表示速度が遅いときの原因究明に重宝します。

「long_query_time = 0」を設定したときのログを転記します。

# Time: 180823  19:00:00
# User@Host: test[test] @ localhost []
# Query_time: 0.000063  Lock_time: 0.000000 Rows_sent: 0  Rows_examined: 0
use test;
SET timestamp=1535018400
use `test`;
# administrator command: Prepare;
# User@Host: test[test] @ localhost []
# Query_time: 0.000070  Lock_time: 0.000014 Rows_sent: 0  Rows_examined: 0
SET timestamp=1535018400;
select * from test;

 

スロークエリ―の設定確認

slow_queryが有効になっているかの確認方法を記載します。設定後の念のための確認、またはslow_queryを設定したはずなのに正常に動作していないのでは?と感じたときにチェックして下さい。
※スロークエリ―の設定確認を行うときはroot権限が必要です。

「slow_query_log」が「ON」のとき、「slow_query_log_file」にログが出力されます。

mysql> show variables like 'slow_query_%';
+---------------------+-------------------------+
| Variable_name       | Value                   |
+---------------------+-------------------------+
| slow_query_log      | ON                      |
| slow_query_log_file | /var/log/mysql/slow.log |
+---------------------+-------------------------+
2 rows in set (0.00 sec)

実行時間が「long_query_time」の設定値を超えるクエリがスロークエリとして出力されます。

mysql> show variables like 'long%';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 3.000000 |
+-----------------+----------+
1 row in set (0.00 sec)