この記事には広告を含む場合があります。
記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
スロークエリを出力して原因を調査する
ウェブページの表示が遅いとき、もっとも多い原因となるのは SQL の実行に時間がかかっている可能性です。今回は実行が遅い SQL を見つける方法であるスロークエリの使い方をお伝えいします。
スロークエリーの出力設定
スロークエリーを確認したいときは、MySQL の設定ファイルである my.cnf にスロークエリー(実行が遅いsql)を出力する設定を行います。Linux の OS により設定ファイルのパスは差異がある可能性がありますが、/etc/my.cnf であることが多いです。
スロークエリの出力設定を行ったサンプル
1 2 3 4 5 6 7 8 |
[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 の再起動を行う必要があります。
1 2 3 |
[root@localhost]# service mysqld restart Stopping mysqld: [ OK ] Starting mysqld: [ OK ] |
実行する全てのsql命令を出力する
スロークエリーの設定を応用して、実行した全ての sql をログ出力することができます。
設定方法は「long_query_time = 0」を設定するだけです。主な利用用途として、開発に携わっていないWeb開発プロジェクトのページの表示速度が遅いときの原因究明に重宝します。
「long_query_time = 0」を設定したときのログを転記します。
1 2 3 4 5 6 7 8 9 10 11 |
# 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」にログが出力されます。
1 2 3 4 5 6 7 8 |
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」の設定値を超えるクエリがスロークエリとして出力されます。
1 2 3 4 5 6 7 |
mysql> show variables like 'long%'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time | 3.000000 | +-----------------+----------+ 1 row in set (0.00 sec) |