スロークエリーログは、実行に long_query_time
秒を超える時間がかかり、少なくとも min_examined_row_limit
行を検査する必要がある SQL ステートメントで構成されます。 スロークエリーログは、実行に長い時間がかかっているため最適化の候補となるクエリーを見つけるために使用できます。 ただし、長いスロークエリーログの調査には時間がかかる場合があります。 これを簡単にするために、mysqldumpslow コマンドを使用してスロークエリーログファイルを処理し、その内容を要約できます。 セクション4.6.9「mysqldumpslow — スロークエリーログファイルの要約」を参照してください。
初期ロックを取得する時間は実行時間として計算されません。mysqld がスロークエリーログにステートメントを書き込むのは、ステートメントが実行されて、すべてのロックが解放されたあとであるため、ログの順序が実行順と異なる場合があります。
long_query_time
の最小値およびデフォルト値は、それぞれ 0 および 10 です。 値はマイクロ秒の精度まで指定できます。
デフォルトでは、管理ステートメントはログに記録されず、参照にインデックスを使用しないクエリーも記録されません。 あとで説明するように、この動作は log_slow_admin_statements
および log_queries_not_using_indexes
を使用して変更することができます。
デフォルトでは、スロークエリーログは無効になっています。 初期のスロークエリーログ状態を明示的に指定するには、--slow_query_log[={0|1}]
を使用します。 引数を指定しないか、引数が 1 の場合、--slow_query_log
によってログが有効になります。 引数が 0 の場合、このオプションによってログが無効になります。 ログファイル名を指定するには、--slow_query_log_file=
を使用します。 ログの宛先を指定するには、file_name
log_output
システム変数 (セクション5.4.1「一般クエリーログおよびスロークエリーログの出力先の選択」 を参照) を使用します。
TABLE
ログの保存先を指定する場合は、ログテーブルおよび「「開いているファイルが多すぎます」」エラー を参照してください。
スロークエリーログファイルの名前を指定しない場合、デフォルト名は
です。 サーバーは、別のディレクトリを指定する絶対パス名が指定されないかぎり、データディレクトリ内にファイルを作成します。
host_name
-slow.log
実行時にスロークエリーログを無効化または有効化したり、ログファイル名を変更したりするには、グローバルな slow_query_log
および slow_query_log_file
システム変数を使用します。 slow_query_log
を 0 に設定してログを無効にするか、1 に設定してログを有効にします。 ログファイルの名前を指定するには、slow_query_log_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
システム変数を有効にします。 (この変数が有効になっていても、テーブルの行数が 2 行未満のためにインデックスの存在からメリットが得られないクエリーはログに記録されません。)
インデックスを使用しないクエリーがログに記録されると、スロークエリーログが迅速に増大する可能性があります。 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
設定によって抑制されていてはならない。
log_timestamps
システム変数は、スロークエリーログファイル (および一般クエリーログファイルとエラーログ) に書き込まれるメッセージのタイムスタンプのタイムゾーンを制御します。 一般クエリーログおよびログテーブルに書き込まれるスロークエリーログメッセージのタイムゾーンには影響しませんが、これらのテーブルから取得された行は、CONVERT_TZ()
を使用するか、セッションの time_zone
システム変数を設定することによって、ローカルシステムのタイムゾーンから任意のタイムゾーンに変換できます。
デフォルトでは、レプリカはレプリケートされたクエリーをスロークエリーログに書き込みません。 これを変更するには、log_slow_slave_statements
システム変数を有効にします。 行ベースのレプリケーションが使用されている (binlog_format=ROW
) 場合、log_slow_slave_statements
は効果がないことに注意してください。 クエリーがレプリカのスロークエリーログに追加されるのは、バイナリログにステートメント形式で記録されている場合、つまり binlog_format=STATEMENT
が設定されている場合、または binlog_format=MIXED
が設定されていてステートメントがステートメント形式で記録されている場合だけです。 binlog_format=MIXED
の設定時に行形式でログに記録されるスロークエリー、または binlog_format=ROW
の設定時にログに記録されるスロークエリーは、log_slow_slave_statements
が有効な場合でもレプリカのスロークエリーログに追加されません。
スロークエリーログが有効になっている場合、サーバーは log_output
システム変数で指定された宛先に出力を書き込みます。 ログを有効にすると、サーバーはログファイルを開き、ログファイルに起動メッセージを書き込みます。 ただし、FILE
ログの出力先が選択されないかぎり、ファイルに対するそれ以上のクエリーのロギングは実行されません。 出力先が NONE
の場合、スロークエリーログが有効な場合であってもサーバーはクエリーを書き込みません。 FILE
が出力先として選択されていない場合、ログファイル名を設定してもロギングには影響しません。
スロークエリーログが有効で、FILE
が出力先として選択されている場合、ログに書き込まれる各ステートメントの前には#
文字で始まり、次のフィールドが含まれます (すべてのフィールドが単一行にあります):
-
Query_time:
duration
ステートメントの実行時間 (秒)。
-
Lock_time:
duration
ロックを取得する時間 (秒)。
-
Rows_sent:
N
クライアントに送信された行数。
-
Rows_examined:
サーバーレイヤーによって検査された行数 (ストレージエンジン内部の処理はカウントされません)。
log_slow_extra
システム変数 (MySQL 8.0.14 の時点で使用可能) を有効にすると、サーバーは、前述のフィールドに加えて次の追加フィールドを FILE
出力に書き込みます (TABLE
出力には影響しません)。 一部のフィールドの説明では、ステータス変数名を参照します。 詳細は、ステータス変数の説明を参照してください。 ただし、スロークエリーログでは、カウンタはステートメントごとの値で、セッションごとの累積値ではありません。
-
Thread_id:
ID
ステートメントスレッド識別子。
-
Errno:
error_number
ステートメントのエラー番号。エラーが発生しなかった場合は 0。
-
Killed:
N
ステートメントが終了した場合、理由を示すエラー番号。ステートメントが正常に終了した場合は 0。
-
Bytes_received:
N
ステートメントの
Bytes_received
値。 -
Bytes_sent:
N
ステートメントの
Bytes_sent
値。 -
Read_first:
N
ステートメントの
Handler_read_first
値。 -
Read_last:
N
ステートメントの
Handler_read_last
値。 -
Read_key:
N
ステートメントの
Handler_read_key
値。 -
Read_next:
N
ステートメントの
Handler_read_next
値。 -
Read_prev:
N
ステートメントの
Handler_read_prev
値。 -
Read_rnd:
N
ステートメントの
Handler_read_rnd
値。 -
Read_rnd_next:
N
ステートメントの
Handler_read_rnd_next
値。 -
Sort_merge_passes:
N
ステートメントの
Sort_merge_passes
値。 -
Sort_range_count:
N
ステートメントの
Sort_range
値。 -
Sort_rows:
N
ステートメントの
Sort_rows
値。 -
Sort_scan_count:
N
ステートメントの
Sort_scan
値。 -
Created_tmp_disk_tables:
N
ステートメントの
Created_tmp_disk_tables
値。 -
Created_tmp_tables:
N
ステートメントの
Created_tmp_tables
値。 -
Start:
timestamp
ステートメントの実行開始時間。
-
End:
timestamp
ステートメントの実行終了時間。
指定されたスロークエリーログファイルには、log_slow_extra
を有効にすることによって追加された追加フィールドの有無にかかわらず、行が混在する場合があります。 ログファイルアナライザは、行にフィールド数別の追加フィールドが含まれているかどうかを判断できます。
スロークエリーログファイルに書き込まれる各ステートメントの前には、タイムスタンプを含む SET
ステートメントが付きます。 MySQL 8.0.14 の時点では、タイムスタンプは低速なステートメントの実行が開始された時間を示します。 8.0.14 より前は、タイムスタンプは低速なステートメントが記録された時間 (ステートメントの実行が終了した後に発生) を示していました。
スロークエリーログに書き込まれたステートメント内のパスワードは、文字どおりプレーンテキストで発生しないようにサーバーによって書き換えられます。 セクション6.1.2.3「パスワードおよびロギング」を参照してください。