MySQL 8.0 リファレンスマニュアル


5.4.5 スロークエリーログ

スロークエリーログは、実行に 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 TABLEANALYZE TABLECHECK TABLECREATE INDEXDROP INDEXOPTIMIZE TABLE、および REPAIR TABLE が含まれます。

スロークエリーログに書き込まれるステートメントに、行参照についてインデックスを使用しないクエリーを含めるには、log_queries_not_using_indexes システム変数を有効にします。 (この変数が有効になっていても、テーブルの行数が 2 行未満のためにインデックスの存在からメリットが得られないクエリーはログに記録されません。)

インデックスを使用しないクエリーがログに記録されると、スロークエリーログが迅速に増大する可能性があります。 log_throttle_queries_not_using_indexes システム変数を設定することによって、これらのクエリーに速度制限を課すことが可能です。 デフォルトでは、この変数は 0 で、制限がないことを意味します。 正の値を指定すると、インデックスを使用しないクエリーのロギングについて分あたりの制限が課されます。 そのような最初のクエリーによって 60 秒間のウィンドウが開き、その期間内でサーバーはクエリーを所定の制限までログに記録し、そのあと、追加のクエリーを抑制します。 ウィンドウが終了したときに抑制されたクエリーが存在する場合、サーバーはクエリーが存在した数と、それらに要した集計時間とを示すサマリーをログに記録します。 インデックスを使用しない次のクエリーをサーバーがログに記録するとき、別の 60 秒間のウィンドウが開始されます。

サーバーは、スロークエリーログにクエリーを書き込むかどうかを判断するために、制御パラメータを次の順序で使用します。

  1. クエリーは管理ステートメントでないか、log_slow_admin_statements が有効になっている必要がある。

  2. クエリーに少なくとも long_query_time 秒かかっているか、log_queries_not_using_indexes が有効であって、クエリーは行参照にインデックスを使用していない。

  3. クエリーは少なくとも min_examined_row_limit 行を検査している必要がある。

  4. クエリーは、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「パスワードおよびロギング」を参照してください。


関連キーワード:  ステートメント, スロークエリーログ, サーバー, 変数, ログ, クエリー, 実行, 記録, リファレンス, 設定