楽々スロークエリーログ解析


スロークエリーログ、解析したくないです。でも楽に解析できるなら・・・

スロークエリ画像1

  • こんなスロークエリーログのよくわからない文字の羅列、もう見たくない、消し去りたい、という方、多いかと思います。
  • 今回、解析の一助として、個人的に重宝しているツールがあるので、ご紹介します。
  • ※MySQLのスロークエリーログ解析についてです
  • ※versionによって、動作や仕様が異なる可能性があります。詳細な内容は公式をご覧ください。

MySqlスロークエリーログ解析ツール【slp】

公式git

https://github.com/tkuchiki/slp

slpとは

  • あんなに見たくないスロークエリーログをこんな感じにキレイにまとめてくれる
    スロークエリ画像2

    • ※実際に使用すると、sumの数字もちゃんとでます
  • mysqlのスロークエリーログを良い感じにまとめてくれる。
  • コマンドツール。
  • 「どんなSQL」が「何個」で「どれくらい時間がかかっているか」を出力してくれる。
    • 平均時間や最高・最低時間、その合計時間等も出力してくれる。
  • SQLは、whereの中身や個数等が違ものでも、「1種類」としてカウントしてくれる。
    • 設定でどのように出力するか、変更可能
  • 二つのログを比べて比較することも出来る

mysqldumpslowより便利と思う点

  • mysql-serverが無くても解析できます!!
  • 解析結果が見やすい!!

導入(準備)

  • どのOSでも基本的に使用可能と公式にあります。
  • 今回はlinuxとWindowsの導入方法を紹介します。

    linux編

    1. ダウンロード
    2. Download from https://github.com/tkuchiki/slp/releases
    3. 上記から、ダウンロードファイルを選択する
      1. slp_linux_amd64.tar.gz の選択肢があるので、それをダウンロード
      2. ダウンロードしたモノを解凍
        1. 解凍したら slp というファイルが出現します。
    4. /usr/local/binへslpのファイルを移動させる
    5. バージョン確認
    6. slp --version
    7. 上記を実行すると、gitの最新コミット履歴が表示される
    root@diet:/home/diet# slp -v
    e32a6cf
    root@diet:/home/diet# slp --version
    e32a6cf

Windows編

  1. ダウンロード
    1. Download from https://github.com/tkuchiki/slp/releases
    2. 上記から、ダウンロードファイルを選択する
      1. slp_windows_amd64.tar.gz の選択肢があるので、それをダウンロード
      2. ダウンロードしたモノを7zipとかで解凍
        1. 解凍したら slp.exe というファイルが出現します。
      3. 任意の場所に slp.exe を移動させる
        1. C:\tools\とか、どこでも良い
  2. パスを通す
    1. システムの環境変数の PATH に C:\tools\ を追加
    2. 設定→システム→設定→システムの詳細設定→環境変数
      1. Pathに実際に配置したディレクトリまでのpathを設定
  3. バージョン確認
    1. slp --version
      1. 上記を実行すると、バージョン表記される
        PS C:\Users\diet> slp -v
        0.1.2

使用方法

基本的な使い方

  • catを使う
    • cat の後にパイプでつなげてslpのコマンドを打つ
  • 結果をファイルに出力する
    • 出力するのは、htmlが個人的にお勧め
  • ファイルに出力する時に、どういう集計をするか、指定する

具体例

cat mysql-slow-dietmysql-2023100308.log |
slp -r --sort=sum-query-time --format=html > slp_out_text.html
  • cat でファイルを指定する
  • -r はリバース。降順する
  • -sortは何をソートさせるのか
    • 今回は合計秒(平均*個数)を降順させている
  • -format=htmlでhtmlで出力するように指定
  • > slp_out_text.htmlでファイル名を指定

便利そうなオプション

-sort=count

  • 解析結果を表示する際にソートしてくれます。
    • 昇順でソートする
    • count, query
    • min-query-time, max-query-time, sum-query-time, avg-query-time
      • 他にもたくさんあるので、公式のgitを見てみてください。
    • デフォルトは count でした。

r, --reverse

  • -sort オプションのソート結果を降順にしてくれます。

-format=table

  • 解析結果を テーブル、Markdown, TSV, CSV, HTML 形式で出力してくれます。
  • デフォルトはテーブル形式とのことです。
  • 個人的なお勧めはhtmlでの出力です。
    • gridjsを使用されているので、paginationオブジェクトの中身を見やすい数に変更すると使い勝手が上がります。

a, -noabstract

  • すべての数値と文字列を N'S' に置き換えないようにしてくれます。

-bundle-values

  • INSERT 文の VALUES の値の個数が違うクエリを一つのクエリとして集計してくれます。

-bundle-where-in

  • WHERE IN の値の個数が違うクエリを一つのクエリとして集計してくれます。

便利そうなオプション2(フィルタ)

具体例

cat mysql-slow-dietmysql-2023100308.log |
slp -r --sort=avg-query-time --filters="Query contains 'hoge'"
--format=html > slp_out_text.html
  • これは、クエリの中で hoge文字列を含むように抽出するように設定しています

使い方

書き方

  • --filters="Query contains 'hoge'"
      • -filtersオプションを付ける
    • ダブルクォーテーションの中で、式を書く

意味

  • Query
    • 実際のクエリの文字列
    • これは、この解析ツールで使える変数の一つ
  • contains
    • 対象の文字列を含む
    • これは、この解析ツールで使える演算子の一つ

フィルタで使える変数と演算子

変数

以下の変数に対してフィルタをかけることが出来ます。

  • Query
    • SQL
  • QueryTime
    • クエリの実行時間(秒)
  • LockTime
    • ロックを取得した時間(秒)
  • RowsSent
    • クライアントに送信された行数
  • RowsExamined
    • サーバーレイヤーで走査された行数
  • RowsAffected
    • 変更があった行数
  • BytesSent
    • すべてのクライアントに送信されたバイト数

演算子

以下の演算子を使用出来ます。

  • +, , , /, %, *(べき乗)
  • ==, !=, <, >, <=, >=
  • not, !
  • and, &&
  • or, ||
  • matches
    • 正規表現(PATTERN)にマッチするか否か
    • e.g.
      • Query matches "PATTERN"
      • not(Query matches "PATTERN")
  • contains
    • 文字列(STRING)を含むか否か
    • e.g.
      • Query contains "STRING"
      • not(Query contains "STRING")
  • startsWith
    • 文字列に前方一致するか否か
    • e.g.
      • Query startsWith "PREFIX"
      • not(Query startsWith "PREFIX")
  • endsWith
    • 文字列に後方一致するか否か
    • e.g.
      • Query endsWith "SUFFIX"
      • not(Query endsWith "SUFFIX")
  • in
    • 配列の値を含むか否か
    • e.g.
      • QueryTime in [0.1, 0.2]
      • Method not in [0.1, 0.2]

最後に

  • ほぼほぼ転載みたいになってしまいました・・・。
  • 個人的に重宝して、かなり便利と感じているツールを紹介させていただきました。
  • 少しでもこのツールの魅力が伝わって頂けると幸いです。