Copy & Paste Engineer

【Mysql】大量のスロークエリログを簡単に解析できる mysqldumpslow

【Mysql】スロークエリを簡単に解析できる mysqldumpslow

Mysql のスロークエリログを簡単に解析できる mysqldumpslow を使ってみる。

mysqldumpslow

mysqldumpslow コマンドを使用することで大量のスロークエリログを簡単に解析できます。

インストール

mysqldumpslow コマンドを使用するにには mysql-server のインストールが必要なようです。 僕は面倒なので mysql のコンテナを使用しました。

使用方法

使用方法は以下です。

mysqldumpslow [オプション] [ログファイル]

オプション一覧

返却値説明

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

スロークエリログの項目説明

第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: 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以降の項目

複数ファイルを一括で解析

以下のようにすると複数のスロークエリログを一括で解析してくれます。

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 を付けると抽象化されないので一番処理時間がかかっているクエリが出てきます。 (まったく同じクエリを何度も投げていたら集計されてしまいますが…

参考