スロークエリーログは、実行に要した時間が long_query_time
秒を超え、少なくとも min_examined_row_limit
行を検査する必要があった SQL ステートメントで構成されます。long_query_time
の最小値およびデフォルト値は、それぞれ 0 および 10 です。値はマイクロ秒の精度まで指定できます。ファイルへのロギングの場合、時間はマイクロ秒の部分も含めて書き込まれます。テーブルへのロギングの場合、時間の整数部のみ書き込まれ、マイクロ秒の部分は無視されます。
デフォルトでは、管理ステートメントはログに記録されず、参照にインデックスを使用しないクエリーも記録されません。あとで説明するように、この動作は log_slow_admin_statements
および log_queries_not_using_indexes
を使用して変更することができます。
初期ロックを取得する時間は実行時間として計算されません。mysqld がスロークエリーログにステートメントを書き込むのは、ステートメントが実行されて、すべてのロックが解放されたあとであるため、ログの順序が実行順と異なる場合があります。
デフォルトでは、スロークエリーログは無効になっています。初期のスロークエリーログ状態を明示的に指定するには、--slow_query_log[={0|1}]
を使用します。引数を指定しないか、引数が 1 の場合、--slow_query_log
によってログが有効になります。引数が 0 の場合、このオプションによってログが無効になります。ログファイル名を指定するには、--slow_query_log_file=
を使用します。ログの出力先を指定するには、(セクション5.2.1「一般クエリーログおよびスロークエリーログの出力先の選択」で説明されている) file_name
--log-output
を使用します。
スロークエリーログファイルの名前を指定しない場合、デフォルト名は
です。サーバーは、別のディレクトリを指定する絶対パス名が指定されないかぎり、データディレクトリ内にファイルを作成します。
host_name
-slow.log
実行時にスロークエリーログを無効化または有効化したり、ログファイル名を変更したりするには、グローバルな slow_query_log
および slow_query_log_file
システム変数を使用します。slow_query_log
を 0 (または OFF
) にすると、ログが無効化し、1 (または ON
) で有効化します。ログファイルの名前を指定するには、slow_query_log_file
を指定します。ログファイルがすでに開いている場合、ログファイルが閉じて新しいファイルが開きます。
スロークエリーログが有効な場合、サーバーは --log-output
オプションまたは log_output
システム変数によって指定されたあらゆる出力先に出力を書き込みます。ログを有効にすると、サーバーはログファイルを開き、ログファイルに起動メッセージを書き込みます。ただし、FILE
ログの出力先が選択されないかぎり、ファイルに対するそれ以上のクエリーのロギングは実行されません。出力先が NONE
の場合、スロークエリーログが有効な場合であってもサーバーはクエリーを書き込みません。ログ出力先の値に FILE
が含まれていない場合、ログファイル名を設定してもロギングへの影響はありません。
--log-short-format
オプションを使用する場合、サーバーによってスロークエリーログ (およびバイナリログ) に書き込まれる情報が少なくなります。
スロークエリーログに書き込まれるステートメントに低速の管理ステートメントを含めるには、log_slow_admin_statements
システム変数を使用します。管理ステートメントには、ALTER TABLE
、ANALYZE TABLE
、CHECK TABLE
、CREATE INDEX
、DROP INDEX
、OPTIMIZE TABLE
、および REPAIR TABLE
が含まれます。
スロークエリーログに書き込まれるステートメントに、行参照についてインデックスを使用しないクエリーを含めるには、log_queries_not_using_indexes
システム変数を有効にします。そのようなクエリーがログに記録されると、スロークエリーログが急速に増大することがあります。log_throttle_queries_not_using_indexes
システム変数を設定することによって、これらのクエリーに速度制限を課すことが可能です。デフォルトでは、この変数は 0 で、制限がないことを意味します。正の値を指定すると、インデックスを使用しないクエリーのロギングについて分あたりの制限が課されます。そのような最初のクエリーによって 60 秒間のウィンドウが開き、その期間内でサーバーはクエリーを所定の制限までログに記録し、そのあと、追加のクエリーを抑制します。ウィンドウが終了したときに抑制されたクエリーが存在する場合、サーバーはクエリーが存在した数と、それらに要した集計時間とを示すサマリーをログに記録します。インデックスを使用しない次のクエリーをサーバーがログに記録するとき、別の 60 秒間のウィンドウが開始されます。
サーバーは、スロークエリーログにクエリーを書き込むかどうかを判断するために、制御パラメータを次の順序で使用します。
クエリーは管理ステートメントでないか、
log_slow_admin_statements
が有効になっている必要がある。クエリーに少なくとも
long_query_time
秒かかっているか、log_queries_not_using_indexes
が有効であって、クエリーは行参照にインデックスを使用していない。クエリーは少なくとも
min_examined_row_limit
行を検査している必要がある。クエリーは、
log_throttle_queries_not_using_indexes
設定によって抑制されていてはならない。
サーバーは、クエリーキャッシュによって処理されるクエリーをスロークエリーログに書き込まず、テーブルに 0 行または 1 行しかないことからインデックスがあることのメリットがないようなクエリーもスロークエリーログに書き込みません。
デフォルトでは、レプリケーションスレーブはレプリケーションされたクエリーをスロークエリーログに書き込みません。これを変更するには、log_slow_slave_statements
システム変数を使用します。
MySQL 5.6.3 以降では、スロークエリーログに書き込まれるステートメントのパスワードはサーバーによって書き換えられ、文字どおりに平文で表示されることはありません。MySQL 5.6.3 より前では、ステートメント内のパスワードは書き換えされないため、スロークエリーログを保護するようにしてください。セクション6.1.2.3「パスワードおよびロギング」を参照してください。
スロークエリーログは、実行に長い時間がかかっているため最適化の候補となるクエリーを見つけるために使用できます。ただし、長いスロークエリーログを調査することは、難しいタスクになる場合があります。これを簡単にするために、mysqldumpslow コマンドを使用してスロークエリーログファイルを処理し、ログに表示されるクエリーを要約することができます。セクション4.6.9「mysqldumpslow — スロークエリーログファイルの要約」を参照してください。