Percona Server 機能紹介 (2) Slow Query Log

引き続きPerconaシリーズ機能紹介で、今回はスロークエリについてです。

Slow Query Log – Percona Server 5.5 Documentation に綺麗に書かれていますが、日本語での要約ということで・・・



スロークエリログの基本設定

処理時間が0.5秒以上 かつ 検索対象が10000行以上のクエリを残す場合はこんな感じ。秒数はマイクロまで可能だけど、まぁ0.1でもやりすぎなくらいでしょう。あと、インデックスを使わないけど軽いクエリってのもあるから、log-queries-not-using-indexes は直接調査する時用かと。

スロークエリ関係はほとんどがDynamicだけど、SET GLOBAL しても新しいセッションに対してしか反映されないので、持続接続を使っている場合だとAPサーバの再起動が必要になるでしょう。

データ作成

時間のかかる処理を行うために、適当な量のデータを作成します。ここでは sysbench を使って、1GB / 440万行 のデータを作成しています。

記録内容

実際のログ

MySQLとPerconaを比較してみると、Perconaの方が多いことがわかります。

MySQL

Percona Server

接続情報

スレッドIDが入っているので、セッション単位で追うことができます。
でもAPから持続接続使ってて同じ種類のIDがズラーってのが普通かもです。

行数の追加情報

Rows_examinedは検索対象となった行数。
Rows_affectedは更新クエリ時の更新行数。
Rows_readはレスポンス行数のようで、ドキュメント説明となんか違う感じ。Rows_sentとの違いはわかりません。

TMPテーブル情報

特にTmp_diskの量は改善対象となるので重要です。

追加記録内容

log_slow_verbosity を設定することで、追加情報を記録できます。

fullでとった内容はこんな感じ。

Query Plan

EXPLAINと同様の、チューニングに重要な情報が簡潔に記録されます。

InnoDB Usage Information

普段Global情報としてしか見れないInnoDB情報を、クエリ単独の数値で残すことができます。各値の説明は、ドキュメント参照で。

フィルター

どのようなログを残すかのフィルターをかけることができます。
例えばDISK上の処理になってしまっているクエリを全て残すなら、このように設定します。

フィルターの種類は log_slow_filter を参照してください。

スロークエリの条件的な設定は全てand条件になり、コンマ区切りの設定値はorになるので、ここまでを合わせると、

  • long_query_time 秒以上 かつ
  • 検索対象が min_examined_row_limit 行以上 かつ
  • DiskのTMPテーブルを使った または Diskでファイルソートした
  • クエリが対象ということになります。

    保存割合

    log_slow_rate_type と log_slow_rate_limit で残すログの割合を調整できます。

  • デフォルトは条件に当てはまったクエリを全て保存します
  • log_slow_rate_type : query にすると、1 / log_slow_rate_limit の確率 (query_id % log_slow_rate_limit is zero) で保存します
  • log_slow_rate_type : session にすると、おそらくthread_idで計算 (thread_id % log_slow_rate_limit is zero) してセッション毎に記録します。非持続接続の場合はHTTP単位になりますが、持続接続の場合はAP接続単位になるでしょう



  • ここまで細かく調整して利用することは少ないかもしれませんが、スロークエリの改善は最も効果的なチューニングの1つであり、スロークエリの改善に注力する時期は必ずあるので、知っておいて損はないはずです。

    個人的には、他人が書いたクエリやスキーマのチューニングという仕事は好きな部類でして、スロークエリ・ゼロを目指す楽しさもさることながら、改善点を見つけ出して
      へいへ~い、何この●●●!?
    って報告してあげる下衆な喜び!!