ただのメモです。
pt-query-digest
percona tookit に含まれるツールの1つ。 スロークエリログやtcpdump からクエリを抽出して、クエリを集計するツール。 負荷をかけているクエリを洗い出すのに便利なヤツ。
https://www.percona.com/doc/percona-toolkit/LATEST/pt-query-digest.html
いつものコマンド
- InnoDB の IO の多い順でソート
InnoDB_IO_r_bytes
は Vanilla MySQLでは出力されない。Percona でしか動かない。
$ pt-query-digest --group-by fingerprint --order-by InnoDB_IO_r_bytes:sum --since 'YYYY-MM-DD HH:MM:SS' --until 'YYYY-MM-DD HH:MM:SS' mysqld-slow.log
- 実行時間の合計でソート
Query_time
の合計でソート
$ pt-query-digest --group-by fingerprint --order-by Query_time:sum --since 'YYYY-MM-DD HH:MM:SS' --until 'YYYY-MM-DD HH:MM:SS' mysqld-slow.log
- たくさん行を読み取っているヤツ
Rows_examined
の合計でソート
pt-query-digest --group-by fingerprint --order-by Rows_examined:sum --since 'YYYY-MM-DD HH:MM:SS' --until 'YYYY-MM-DD HH:MM:SS' mysqld-slow.log
- 回数でソート
〜:cnt
とする。Query_time
の部分は何でも良い。
pt-query-digest --group-by fingerprint --order-by Query_time:cnt --since 'YYYY-MM-DD HH:MM:SS' --until 'YYYY-MM-DD HH:MM:SS' mysqld-slow.log
おまけ
MySQL 8 で FLUSH STATUS
したら、Bytes_received
やら Read_first
がありえ無い大きな値でログが出力された。
# Time: 2020-04-18T13:38:45.798080+09:00 # User@Host: root[root] @ localhost [] Id: 162 # Query_time: 0.002119 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0 Thread_id: 162 Errno: 0 Killed: 0 Bytes_received: 18446744073709551112 Bytes_sent: 18446744073709548672 Read_first: 18446744073709551612 Read_last: 0 Read_key: 18446744073709551597 Read_next: 18446744073709551611 Read_prev: 0 Read_rnd: 0 Read_rnd_next: 18446744073709551609 Sort_me rge_passes: 0 Sort_range_count: 0 Sort_rows: 18446744073709551608 Sort_scan_count: 18446744073709551613 Created_tmp_disk_tables: 0 Created_tmp_tables: 0 Start: 2020-04-18T13:38:4 5.795961+09:00 End: 2020-04-18T13:38:45.798080+09:00 SET timestamp=1587184725; flush status;