Amazon Relational Database Service (Amazon RDS) for MySQL で低速実行クエリをトラブルシューティングしようとしています。なぜこのような問題が発生するのですか? また、クエリのパフォーマンスを向上させるにはどうすればよいですか?
クエリのパフォーマンスを向上させるために、次の要素を検討してください。
データベースパフォーマンスの問題の根本原因を理解するには、インスタンスが使用しているサーバー全体のリソースをすべて確認します。ワークロードをモニタリングし、クエリの実行に長すぎる時間がかかるようになった時点と比較して、クエリのパフォーマンスが通常どおりだった期間を調査できます。
Amazon CloudWatch メトリクスを使用して、パフォーマンスが通常どおりであるとみなされた日数を含む期間、これらのリソースをモニタリングします。Amazon RDS コンソールでパフォーマンスメトリクスを表示して、データベースのパフォーマンスをモニタリングすることもできます。
また、インスタンスのステータスを確認して、データベースのパフォーマンスに影響を及ぼしている可能性のある他のアクティブなプロセスまたはスケジュールされたプロセスを特定することもできます。Amazon RDS コンソールで、データベースのパフォーマンスが悪かったときに発生したイベントを確認します。
リソース消費に寄与しているワークロードを分析するには、Performance Insights を使用します。Performance Insights は、リソース消費の増加に寄与しているすべてのクエリと待機のグラフィック分析を提供します。
Performance Insights は、インスタンスのために、vCPU の数を使用する代わりに、ワークロードを主要なメトリクスとして使用します。現在のワークロードが vCPU の制限を超えると、サーバーは過負荷になります。サーバーが過負荷になっている場合は、ワークロードに寄与しているクエリを確認し、クエリを最適化する方法を特定します。その後、インスタンスクラスを変更することを検討します。
Performance Insights のワークロードは、待機イベントに分割することもできます。待機イベントの数で DB 負荷をスライスして、待機を消費している上位のリソースを調査します。負荷グラフの濃い色の帯は、ワークロードに最も寄与している待機タイプを示します。詳細については、Amazon RDS での Performance Insights を使用した DB 負荷のモニタリングを参照してください。
また、低速クエリログ (カスタムパラメータグループで有効) を使用して、実行速度が遅いクエリを特定することもできます。
その後、Amazon CloudWatch メトリクスを使用して、インスタンスで実行された作業量が増加したかどうかを確認できます。例:
レイテンシーメトリクスは、読み取りまたは書き込みディスク I/O オペレーションの完了までに要した時間を示します。レイテンシーメトリクスと増加したデータベース接続またはスループットメトリクスの相関関係は、ワークロードが低速クエリ実行の理由であることを示唆している可能性があります。使用率の要因の特定に関する詳細については、MySQL を実行している Amazon RDS DB インスタンスでストレージを使用しているものを表示するにはどうすればよいですか? を参照してください。
また、拡張モニタリングを使用して、ワークロードに関係するオペレーティングシステムのリストと基盤となるシステムメトリクスを取得することもできます。デフォルトでは、拡張モニタリングのモニタリング間隔は 60 秒です。データポイントをより詳細にするため、これを 1~5 秒間隔に設定するのがベストプラクティスです。
実行時間の長いクエリが低速クエリログまたは Performance Insights から特定されたら、クエリのパフォーマンスを向上させる方法を検討します。クエリを調整するには、次の方法を検討します。
SELECT r.trx_id waiting_trx_id, r.trx_mysql_thread_id waiting_thread, r.trx_query waiting_query, b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_thread, b.trx_query blocking_query FROM performance_schema.data_lock_waits w INNER JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_engine_transaction_id INNER JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_engine_transaction_id;
詳細については、MySQL ウェブサイトの Using InnoDB transaction and locking information を参照してください。
Tuning Amazon RDS for MySQL with Performance Insights
Amazon RDS for MySQL、MariaDB、または Aurora for MySQL インスタンスでの高い CPU 使用率をトラブルシューティングして解決するにはどうすればよいですか?