【Mysql】スロークエリを簡単に解析できる mysqldumpslow
Mysql のスロークエリログを簡単に解析できる mysqldumpslow を使ってみる。
mysqldumpslow
mysqldumpslow コマンドを使用することで大量のスロークエリログを簡単に解析できます。
インストール
mysqldumpslow コマンドを使用するにには mysql-server のインストールが必要なようです。
僕は面倒なので mysql のコンテナを使用しました。
使用方法
使用方法は以下です。
mysqldumpslow [オプション] [ログファイル]
オプション一覧
-aすべての数字を N に、文字列を ‘S’ に抽象化しません-n少なくとも指定された桁数の数字を抽象化--debug,-dデバッグ情報を書き込み-ggrepオプション、パターンに一致するステートメントのみを考慮--helpヘルプメッセージを表示して終了-hログファイル名内のサーバーのホスト名-iサーバーインスタンスの名前-l合計時間からロック時間を減算しない-rソート順序を逆転-s出力のソート方法t,atクエリー時間または平均クエリー時間でソートl,alロック時間または平均ロック時間でソートr,ar送信行数または平均送信行数でソートcカウントでソート
-t最初から指定された数だけのクエリーのみ表示--verbose冗長モード
返却値説明
mysqldumpslow を実行すると以下のような返却がされます。
Reading mysql slow query log from /usr/local/mysql/data/mysqld80-slow.log
Count: 1 Time=4.32s (4s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost
insert into t2 select * from t1
Count: 3 Time=2.53s (7s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost
insert into t2 select * from t1 limit N
Count: 3 Time=2.13s (6s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost
insert into t1 select * from t1
Count実行回数Time実行平均時間(合計時間Lockロック平均時間(合計時間Rows返却平均行(返却合計行
スロークエリログの項目説明
第154回 スロークエリログに出力される項目とlog_slow_extra | gihyo.jp から引用
# Time: 2021-08-29T08:49:05.382813Z
# User@Host: root[root] @ [172.17.0.1] Id: 10
# Query_time: 9.685363 Lock_time: 0.000210 Rows_sent: 1 Rows_examined: 2097153
SET timestamp=1630226935;
SELECT * FROM test WHERE col1=10;
Mysql 5.7までの項目
Timeスロークエリログに書き込んだ時間User@Hostクエリを実行したユーザアカウントIdSHOW PROCESSLISTのIDQuery_timeステートメントの実行時間(秒)Lock_timeロックを取得した時間(秒)Rows_sentクライアントに送信された行数Rows_examinedMySQLが内部で走査した行数
# Time: 2021-08-29T08:50:58.916765Z
# User@Host: root[root] @ [172.17.0.1] Id: 10
# Query_time: 9.076753 Lock_time: 0.000243 Rows_sent: 1 Rows_examined: 2097153 Thread_id: 10 Errno: 0 Killed: 0 Bytes_received: 0 Bytes_sent: 251 Read_first: 1 Read_last: 0 Read_key: 1 Read_next: 0 Read_prev: 0 Read_rnd: 0 Read_rnd_next: 2097154 Sort_merge_passes: 0 Sort_range_count: 0 Sort_rows: 0 Sort_scan_count: 0 Created_tmp_disk_tables: 0 Created_tmp_tables: 0 Start: 2021-08-29T08:50:49.840012Z End: 2021-08-29T08:50:58.916765Z
SET timestamp=1630227049;
SELECT * FROM test WHERE col1=10;
Mysql 8.0以降の項目
Thread_idIdと同じくSHOW PROCESSLISTのIDErrnoエラー番号、エラーが発生しなかった場合は0Killed終了した場合、理由を示すエラー番号。ステートメントが正常に終了した場合は0Bytes_receivedステートメントのステータスBytes_receivedの値Bytes_sentステートメントのステータスBytes_sentの値Read_xxステートメントのステータス Handler_Read_xxのそれぞれの項目の値Sort_merge_passesステートメントのステータスSort_merge_passesの値Sort_range_countステートメントのステータスSort_range_countの値Sort_rowsステートメントのステータスSort_rowsの値Sort_scan_countステートメントのステータスSort_scan_countの値Created_tmp_disk_tablesステートメントのステータスCreated_tmp_disk_tablesの値Created_tmp_tablesステートメントのステータスCreated_tmp_tablesの値Startステートメントの実行開始時間Endステートメントの実行終了時間
複数ファイルを一括で解析
以下のようにすると複数のスロークエリログを一括で解析してくれます。
mysqldumpslow slow_001.log slow_002.log
サンプル
多用しそうなものをサンプルとして置いておきます。
発生回数でソート 10件表示
発生回数でソートして10件表示
mysqldumpslow -s c -t 10 mysql-slowquery.log
合計処理時間でソート 10件表示
合計処理時間でソートして10件表示
mysqldumpslow -s t -t 10 mysql-slowquery.log
-a を付けると抽象化されないので一番処理時間がかかっているクエリが出てきます。
(まったく同じクエリを何度も投げていたら集計されてしまいますが…