本連載ではこれまでスロークエリログについて、
- 第7回 スロークエリーログを使って遅いクエリを収集する
- 第113回 anemoeaterを使ってスローログを可視化してみる
- 第131回 mysqldumpslowを使ってスロークエリログを解析してみる
これらの記事では、
スロークエリログを出力するための設定方法や、
MySQL 5.7までのスロークエリログに出力される項目
まずは、
スロークエリログを頻繁に確認する人はよくご存知かと思いますが、
Time
…スロークエリログに書き込んだ時間User@Host
…クエリを実行したユーザアカウントId
…SHOW PROCESSLISTのIDQuery_
…ステートメントの実行時間time (秒) Lock_
…ロックを取得した時間time (秒) Rows_
…クライアントに送信された行数sent Rows_
…MySQLが内部で走査した行数examined
これらの項目からよくチューニングするポイントとしては、Rows_
とRows_
を比較することです。この2つの差が大きい場合はインデックスが存在しない
MySQL8.0からスロークエリログに出力される項目
MySQL 8.low_
オプションが追加されました。デフォルトはOFFのため、low_
オプションをONにした結果が以下になります。
このようにかなり項目が増えました。それぞれ簡単に説明します。
Thread_
…id Id
と同じくSHOW PROCESSLISTのIDErrno
…エラー番号、エラーが発生しなかった場合は0 Killed
…終了した場合、理由を示すエラー番号。ステートメントが正常に終了した場合は0 Bytes_
…ステートメントのステータスBytes_received receivedの値 Bytes_
… ステートメントのステータスBytes_sent sentの値 Read_
…ステートメントのステータス Handler_xx Read_ xxのそれぞれの項目の値 Sort_
…ステートメントのステータスSort_merge_ passes merge_ passesの値 Sort_
…ステートメントのステータスSort_range_ count range_ countの値 Sort_
…ステートメントのステータスSort_rows rowsの値 Sort_
…ステートメントのステータスSort_scan_ count scan_ countの値 Created_
…ステートメントのステータスCreated_tmp_ disk_ tables tmp_ disk_ tablesの値 Created_
…ステートメントのステータスCreated_tmp_ tables tmp_ tablesの値 Start
…ステートメントの実行開始時間End
…ステートメントの実行終了時間
ステートメントのステータスというのは、SHOW STATUS
で表示される項目と同様です。いくつかの項目をもとに、
Sortの項目
ソートの項目から値が0ではない場合は、Sort_
の値は注意です。この値はsort_
サイズを超えてファイルsort_
サイズを大きくする、
また、Sort_
はソートした行数が表示されます。しかし、ORDER BY col1 LIMIT 50
というクエリがあった場合、Sort_
の値はLIMITの値の50になります。そのため、Sort_
が少ないからソート処理しても問題ないだろうと考えるのではなく、Rows_
の値も一緒に確認すると良いでしょう。
Created_tmpの項目
この値は内部テンポラリーテーブルを作成した回数になります。
Created_
はインメモリテンポラリテーブルを作成した回数で、Created_
はディスクテンポラリテーブルを作成した回数です。内部テンポラリテーブルについては、
Created_
が0ではない場合は内部テンポラリテーブルが大きいと思われるので、
Bytes_sentの項目
Bytes_
今までは、log_
オプションを有効にして確認するとよいでしょう。
StartとEnd
従来のスロークエリログでは、Time
の項目にスロークエリログが書き込まれた時間を表示していました。実質、End
のクエリの終了時間と同様になります。
Time
からQuery_
時間を引いてクエリの実行開始時間を出していましたが、Start
項目が追加され、
まとめ
今回はスロークエリログの出力項目と、
ちなみに、low_
オプションの追加項目に対応しているのでしょうか。確認したところ、