エキサイトのAです。
RDSではスロークエリを出力する機能がありますが、
今回はAWSのCloudWatch Logs Insightsを使ったスロークエリの改善について紹介させていただきます。
Amazon CloudWatch Logsとは、AWSのEC2インスタンスやRDS、Route53などのAWS上のサービスのログを可視化して確認できるサービスです。
CloudWatch Logs Insightsを使うことで、CloudWatch Logsのログを検索して分析することができます。
RDS側でスロークエリログを出力する設定を行う
まずはCloudWatch LogsにRDSのスロークエリを設定を行います。 「データベースの設定」を行う際に詳細設定から設定することができます。 既にDBを作っている場合でも「DB クラスターの変更」からいつでも設定可能です。
設定が終わったらCloudWatch Logs上で /aws/rds/[インスタンス or クラスター]/[インスタンス名 or クラスター名]/slowquery
といったログができていることを確認します。
あとはClowdWatch Logs上からLogs Insightsを開いてスロークエリの確認を行えます。
Logs Insightsのクエリについて
Logs Insightsではクエリを投げることによって、確認しているログの中から指定のログを取ってくることができます。
デフォルトの
fields @timestamp, @message | sort @timestamp desc | limit 20
では、スロークエリのタイムスタンプとメッセージを最新20件取ってくるクエリが書かれています。
主に使うものとして
- filter 1 つ以上の条件に一致するログ情報を取得。
- sort ログイベントを昇順 (asc) または降順 (desc) でソートする。
- limit ログイベントの数を指定。
- parse ログイベントから、正規表現で処理できる一時的なフィールドを作成。
- display 表示したい内容を設定する。
- fields ログイベントから取得したいフィールドを設定。
などが挙げられます。
その他のクエリの構文については以下の公式ドキュメントで紹介されています。 docs.aws.amazon.com
クエリの例
クエリタイムの長い順に100件取得
fields @timestamp, @message | parse @message /Query_time:\s*(?<Query_time>[0-9]+(?:\.[0-9]+)?)\s*[\s\S]*?;/ | display @timestamp, Query_time, @message | sort Query_time desc | limit 100
このように、parseで取得ログを指定したり、様々な条件を指定することで欲しいログの分析を行うことができます。 また、今回はスロークエリにのみ絞りましたが通常のログや監査ログなどでも当然使用可能です。 更に詳細なクエリについてはまた別途紹介させていただきます。
SQLにコメントを書く
素早い原因究明と検索のしやすさの観点からどのようなクエリなのかを明確にするため、SQLにコメントはできるだけ書いておくことが重要です。
# 指定の作者名からidを取得する SELECT id FROM table WHERE author = 'taro'
例として上記のようにクエリコメントを書くことで、SQLがどのようなクエリなのかを一目でわかる上に、filter条件に指定の作者名からidを取得する
と追加することで
関連クエリを検索しやすくなります。
終わりに
クエリの分析を素早く行うことで普段のクエリ改善の効率化だけではなく、障害が起きた際の対応も早くなります。 そのため、普段からクエリの分析はできるように慣れておくと良いです。