Amazon RDS「Performance Insights」を有効化して、CPU負荷の高いSQLを特定する。
- CPU負荷の高い順番にSQLの一覧が表示できます。
- マネージメントコンソールのRDSの画面から有効化できます。
- この機能でCPU負荷の高いSQLを特定します。
Performance Insights の有効化と無効化
Performance Insights: 概要
CPU負荷の高いSQLをexplainで分析する。
MySQL Workbenchの「Visual Explain」機能で、explainの結果を図で表示する。
- explain によるSQLの分析結果をそのまま文字で見ても、どこに問題があるのか理解しづらいです。
- MySQL Workbenchの「Visual Explain」機能を利用すれば、SQLのどこに負荷がかかっているか、indexが利用されていないか図で表示されます。
7.5 Tutorial: Using Explain to Improve Query Performance
MySQL Workbench: VISUAL EXPLAIN でインデックスの挙動を確認する
exlainの結果、見つかった問題の対応
個人的によく見る問題と解決策を紹介します。
レコード数が多いテーブルを全件取得しているような場合
- 本当に最新かつ全件のレコードを取得する必要があるのか検討します。
- 一部のレコードだけを取得するのでは問題があるか
- 最新のレコードを取得する必要があるか。
- 30分に1回取得してキャッシュに保持しているレコードを利用するようなことはできないか。
indexが利用されていない場合
テーブルにindexを設定します。
indexは期待通りに利用されているが、レコード数が多くて負荷が高くなっている場合
- 対象のデータが頻繁に更新されるものでなければ、キャッシュに保持してMySQLからの参照する回数を減らせないか検討します。
- インメモリデータベース(Redis, memcached等) に取得結果を保存する。
- 各言語のキャッシュのライブラリを利用して、MySQLからの取得結果を保存する。
全文検索、位置情報による検索に時間がかかっている場合
- Elasticsearch等の MySQLよりも、やりたい検索処理に特化しているアプリケーションを利用することを検討します。