WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

処理が遅いSQL文をスロークエリログとして出力する

      2015/02/24

スロークエリログの設定

スロークエリログとは、SQL分の実行にかかる時間が設定値以上である場合に出力されるログです。
負荷の高いSQL分を調べるときに重宝します。

スロークエリログを有効にするには、my.cnfに以下のように記述します。

# vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
character-set-server = utf8
init-connect = SET NAMES utf8
~(略)~
※以下を追記
log_slow_queries
long_query_time = 1
slow_query_log_file=mysql-slow.log
log-queries-not-using-indexes

この例だと、処理するのに1秒以上かかったSQL文を、mysql-slow.logというファイル名で出力するように設定しています。ログが出力されるディレクトリはdatadirパラメータで指定したパスとなります。

※追記
MySQL5.0.77がインストールされているサーバでは上例では動作せず、以下のように記述すると動作しました。

log_slow_queries=mysql-slow.log
long_query_time = 1
log-queries-not-using-indexes

※再追記
MySQL5.6.15だと”log_slow_queries”ではなく”slow_query_log=ON”と書かないと起動できませんでした。

(起動に失敗するけど”Starting MySQL… ERROR! The server quit without updating PID file”とかって出て設定ファイルの書式によるエラーだってわかりにくいのが厄介)

なお、各パラメータの意味は下表の通りです。

パラメータ名 意味 記載例 記載するセクション
log_slow_queries スロークエリログの出力の有効/無効の選択 log_slow_queries(※パラメータなしで記載) mysqld
long_query_time スロークエリログの出力対象となる秒単位で指定。
※MySQL5.1からは小数点をつけると1秒未満でも設定可能
long_query_time = 1 mysqld
slow_query_log_file スロークエリログを出力する場所 slow_query_log_file=mysql-slow.log mysqld
log-queries-not-using-indexes インデックスを使わない検索をスロークエリログとして出力する log-queries-not-using-indexes(※パラメータなしで記載) mysqld

スロークエリログの見方

実際にスロークエリログを確認してみましょう。

# less /var/lib/mysql/mysql-slow.log
/usr/sbin/mysqld, Version: 5.5.13-log (MySQL Community Server (GPL)). started with:
Tcp port: 0  Unix socket: (null)
Time                 Id Command    Argument
# Time: 110723 13:22:02
# User@Host: root[root] @ localhost []
# Query_time: 7.677186  Lock_time: 0.156390 Rows_sent: 1  Rows_examined: 1386155
use hoge_db;
SET timestamp=1311394922;
SELECT count(*) FROM `hoge_table` WHERE (hoge_time between '2011-07-19 18:00:00' AND '2011-07-19 19:00:00') AND (hoge_id = 1) AND (hage_id = '1');

上記の赤字部分がスロークエリログの一例ですが、

  • 1行目 記録日時
  • 2行目 ユーザーIDとリクエストした端末
  • 3行目 Query_time(実行時間) Lock_time(ロック時間) Rows_sent(送信行数) Rows_examined(処理対象となった行数)
  • 4行目 SQL文

という内訳になっています。

スロークエリログ設定の注意点

  • ログの出力が多すぎる場合、I/O負荷が高まるので注意する必要がある。

 - MySQL , , ,