読者です 読者をやめる 読者になる 読者になる

よんちゅBlog

― このブログは自分用のメモや日々の問題などを共有するためのものです ―

20121005185841 お知らせ:  2013/07/17 ブログデザインをリニューアルしました。

MySQL5.0/5.1でスロークエリログを記録

MySQL

MySQLでスロークエリログを記録する方法は、バージョンによって設定方法が異なったり、オプション名が変更されていたりと、意外と分かりづらいことが多いのでここでまとめておこうと思います。

いずれのバージョンでも、コンフィグファイル(Linuxでは my.cnf、Windowsでは my.ini)の mysqld セクションに設定を記述することになります。

MySQL5.0の場合

MySQL5.0の設定方法は簡単で、「log-slow-queries」にログを出力するファイル名を設定するだけです。

絶対パスによる指定も可能ですが、相対パスで指定した場合はデータディレクトリからの相対パスになります。

また、スロークエリとして記録されるクエリのしきい値、つまり何秒以上のクエリをスロークエリとしてログに記録するかはデフォルトで10秒以上となっています。
この値は「long_query_time」によって変更することができます。(最低1秒)
環境に応じて適宜値を変更しましょう。

※ 単語の区切りがハイフン(-)ではなくアンダースコア(_)になっていることに注意して下さい。

その他のオプションとして「log-queries-not-using-indexes」を設定することで「long_query_time」の設定値に関わらずインデックスを使用しないクエリを全て記録することができます。

ちなみに「インデックスを使用しない」とは「フルーテーブルスキャン」と「フルインデックスインデックススキャン」のことを指します。

開発環境などのようにデータが少ない場合には、効率の悪いクエリでも実行時間が短くなるため、スロークエリに引っ掛からないことがあります。
こういったケースでは「log-queries-not-using-indexes」を指定してみると良いでしょう。

# 設定例
[mysqld]
log-slow-queries = /usr/local/mysql/var/slow_query.log
long_query_time = 1
log-queries-not-using-indexes
変数名 説明
log-slow-queries ログ出力先ファイル名(絶対パス/想定パス指定可)
long_query_time 指定した時間(sec)以上かかったクエリを記録(デフォルト10秒)
log-queries-not-using-indexes 指定するとインデックスを使用しないクエリも記録する


このようにMySQL5.0では設定が非常に簡単なのですが、やや機能不足な感は否めないですね。

MySQL5.1の場合

MySQL5.1からは一部変数名が変更されていることに注意して下さい。
(一応MySQL5.0で使用していた変数も使用するこはできます・・・)


まず変更点としては、「slow_query_log」によってスロークエリの有効/無効を設定することができるようになりました。
(MySQL実行中にも変更可能です。)
設定値は、0(または OFF)で無効、1(または ON)で有効です。


またスロークエリログをファイルに出力するかテーブル(mysql.slow_log)に出力するかを選択出来るようになりました。
デフォルトではテーブル出力です。

ログ出力先をテーブルにするかファイルにするかは「log_output」によって設定します。

# テーブルに出力する場合
log-output = TABLE
# テーブルとファイル両方に出力する場合
log-output = TABLE,FILE

出力先がファイルの場合は「slow_query_log_file」によって出力先ファイルを指定します。
(指定方法はMySQL5.0で使用していた「log-slow-queries」と同じで絶対パス相対パスいずれも設定可能です。)

スロークエリのしきい値「long_query_time」の設定方法はMySQL5.0の時と基本的には同じですが、5.1からは1秒未満(少数)の値も設定できるようになりました。
また、0を指定することで全てのクエリを記録することもできます。

インデクスを使用しないクエリを記録する場合は「log_queries_not_using_indexes」を使用します。
設定値は、0(または OFF)で無効、1(または ON)で有効です。

[mysqld]
# 設定例
slow_query_log = 1
log_output = FILE
slow_query_log_file = /usr/local/mysql/var/slow_query.log
long_query_time = 1
log_queries_not_using_indexes = 1
変数名 説明
slow_query_log スロークエリログの有効/無効を設定 0(または OFF)で無効、1(または ON)が有効
log-output 出力対象を設定 ファイル(FILE)、テーブル(TABLE)または両方を指定可能
slow_query_log_file ログ出力先ファイル名(絶対パス/想定パス指定可)
long_query_tim 指定した時間(sec)以上かかったクエリを記録(デフォルト10秒)
log_queries_not_using_indexes インデックスを使用しないクエリを記録
min_examined_row_limit 指定数以上のレコードを読み込んだ場合にクエリを記録

もっと詳しく知りたい方は
スロークエリに関する公式リファレンスを参照すると良いでしょう。