現代のデータベース運用において、「クエリが遅い」という声を聞かない日はありません。しかし、この単純な問題の背後には、複雑で奥深い世界が広がっています。本記事では、MySQL のパフォーマンス監視と最適化に関する包括的なアプローチを、実践的な視点から解説していきます。

なぜクエリは遅くなるのか

多くのエンジニアが直面する「クエリが遅い」という問題に対して、私たちはつい「インデックスを追加すれば解決する」「サーバーのスペックを上げれば良い」と考えがちです。しかし、MySQL のパフォーマンスは決して単一の要因で決まるものではありません。

実際には、クエリ自体の構造、データベーススキーマの設計、データアクセスパターン、接続の動作、さらにはオペレーティングシステムやアプリケーション自体まで、システム全体の要素が複雑に絡み合ってパフォーマンスに影響を与えています。

MySQL パフォーマンスの本質を理解する

MySQL におけるパフォーマンスとは、何を意味するのでしょうか。その答えは「クエリ応答時間」にあります。これは、クエリがデータベースに送信されてから、完全な結果がクライアントに返されるまでの総時間のことです。

なぜ応答時間が重要なのかというと、これがエンドユーザーエクスペリエンスを直接反映する唯一のパフォーマンス指標だからです。私たちが感じるのは「百万行が検索された」という事実ではなく、「7.5 秒の待ち時間」という体験なのです。

クエリ応答時間の内訳

クエリ応答時間は、複数の要素に分解することができます。まず、クライアントからサーバーへの転送時間があります。次に、MySQL が SQL を解析し、構文やセマンティクスをチェックして実行プランを構築するクエリ解析と最適化の時間が続きます。

そして最も重要な実行時間では、インデックスの読み取り、結合の実行、データのフィルタリングや並べ替えなど、クエリの中核部分が実行されます。データがメモリ(バッファプール)上に存在しない場合は、ディスクからの読み取りも発生します。最後に、結果セットをクライアントに送信する時間も含まれます。

一般的なパフォーマンス課題を理解する

MySQL のパフォーマンス問題は、いくつかの典型的なパターンに分類できます。まず、クエリの複雑さが挙げられます。複雑な結合やサブクエリは、実行時間を大幅に増加させる可能性があります。

インデックス戦略の問題も重要です。インデックスが不足していると、フルテーブルスキャンが発生し、パフォーマンスが大幅に低下します。一方で、過剰なインデックスは書き込み性能に悪影響を与えることもあります。

データの成長とスケーラビリティも無視できません。大きな結果セットの処理や、時間の経過とともに増加するデータ量への対応は、継続的な課題となります。さらに、同時実行性とロッキングの問題、つまり高い競合状態での行レベル待機やロックも、パフォーマンスに大きな影響を与えます。

最後に、CPU、メモリ、ディスク I/O、ネットワークレイテンシといったシステムリソースの競合も、パフォーマンス低下の要因となります。

MySQL を高速化する戦略

MySQL のパフォーマンスを劇的に向上させる銀の弾丸は存在しません。クエリやアプリケーションに手を加えることなく大幅な改善を期待するのは現実的ではありません。しかし、MySQL により多くの作業を同じ時間で処理させるには、二つの実用的な選択肢があります。

第一の選択肢は、応答時間の短縮です。これは、各クエリの実行速度を最適化することを意味します。具体的には、クエリのチューニング、インデックスの最適化、スキーマの改善、またはアクセスパターンの見直しが含まれます。

第二の選択肢は、負荷容量の増加です。これは、より多くの同時クエリを処理できるように MySQL をスケールすることです。重要なのは、応答時間と CPU 時間は同じではないということです。例えば、10ms の CPU 時間と 90ms のディスク I/O で、合計 100ms の応答時間になる場合があります。この場合、読み取りレプリカの使用、より良いハードウェアの導入、またはアーキテクチャの変更が有効な解決策となります。

パフォーマンスチューニングの方法論

MySQL のパフォーマンスチューニングは、一度きりの修正ではなく、継続的な取り組みです。その目標は、より高速なクエリ応答時間の実現にあります。このプロセスには時間と労力、そして反復的な改善が必要です。

効率的で無駄のない作業を行うために、2 つの主要なアプローチに焦点を当てる必要があります。直接的なクエリ最適化では、SQL そのものをチューニングします。これには、構造の改善、フィルターや結合の最適化、そしてインデックス戦略の見直しが含まれます。

一方、間接的なクエリ最適化では、クエリ自体ではなく、データとアクセスパターンの変更に焦点を当てます。この手法は、直接的な最適化だけでは限界がある場合に特に有効です。

直接的なクエリ最適化のツール

直接的なクエリ最適化には、いくつかの基本的なツールがあります。まず、クエリ分析によって、SQL の意図と構造を理解します。次に、EXPLAIN 文や EXPLAIN ANALYZE 文を使用して、MySQL がクエリをどのように実行するかを確認します。そして、ルックアップや結合を高速化するために、インデックスを追加または調整します。

より専門的なツールとしては、範囲最適化、インデックスマージ最適化、ハッシュ結合最適化、インデックス条件プッシュダウン(ICP)、マルチレンジリード(MRR)、定数畳み込み最適化などがあります。これらは、MySQL が実行を自動的に最適化するために使用する高度な機能ですが、その仕組みを理解することで、より効率的なクエリを書けるようになります。

クエリ分析の重要性

クエリ分析では、「なぜ遅いのか」だけでなく、「どのように動作するのか」を理解することが目標です。これにより、最適化を行う前にボトルネックや非効率性を特定できます。

分析には、クエリメトリクス(実行時データ)、メタデータ(EXPLAIN、テーブル構造、インデックス)、そしてアプリケーションコンテキスト(クエリが何を試みているか)の組み合わせが必要です。

重要なクエリメトリクスとして、実行にかかった総時間であるクエリ時間、ロック待機に費やした時間、実行中にスキャンされた行数、クライアントに返された行数、変更された行数(INSERT/UPDATE/DELETE)、フルテーブルスキャンの回数、インデックスを使用しない結合の回数、ディスクに書き込まれた一時テーブル(遅い処理)の数、そしてクエリ実行の頻度があります。

EXPLAIN と EXPLAIN ANALYZE の活用

EXPLAIN は、MySQL がクエリの実行をどのように計画しているかを示し、ボトルネックになる前に非効率性を発見するのに役立ちます。一方、EXPLAIN ANALYZE は実際にクエリを実行し、オプティマイザーの推定値と実際の結果を比較できます。

例えば、以下のような出力を見ることで、推定値と実測値の違いを確認できます。実際の統計と推定統計が大きく異なる場合、統計の更新やヒストグラムの見直しが必要かもしれません。

EXPLAIN と EXPLAIN ANALYZE

間接的なクエリ最適化

直接的な最適化が限界に達した場合、間接的なアプローチが必要になります。インデックスは必要ですが、常に十分ではありません。インデックスはデータサイズに対して無限にスケールするわけではなく、行数が増加するにつれて、インデックスの選択性が低下する可能性があります。以前は効果的だったインデックスも、より大きなデータセットでは効果を失うことがあります。

結合についても注意が必要です。MySQL は結合を並び替えることができるため、結合されるテーブルでより良いインデックスを活用できます。しかし、インデックスがない場合はフル結合(非常に高コスト)となり、インデックスがあっても、特定の行にマッチしない場合はパフォーマンスが低下する可能性があります。

データ量の削減も効果的な戦略です。必要な列のみを返す、LIMIT やより良いフィルターで結果セットのサイズを制限する、必要でない限りソートを避ける(ソートはリソース集約的)、古いデータを定期的に削除またはアーカイブするなどの手法があります。特に、ログテーブル、監査証跡、時系列データについては、定期的なアーカイブが重要です。

負荷容量の増加について

クエリの修正だけでは不十分な場合、負荷容量の増加を検討する必要があります。パフォーマンスは負荷とともに向上しますが、限界があります。MySQL のパフォーマンスは、システム容量の約80-95%まで負荷に応じて向上しますが、それを超えると不安定になります。スループットと応答時間に激しい変動が生じ、クエリパフォーマンスの低下や障害のリスクが高まります。

このような状況では、負荷自体を調整することが重要です。不要なクエリの除去、可能な場合のクエリ頻度の削減、MySQL を過負荷にする連続的な再試行の制限などが有効です。

さらに、負荷の分散も考慮すべきです。読み取りレプリカによる読み取りの分散、競合を減らし負荷を分散するためのデータの論理的または物理的パーティショニングなどの手法があります。

書き込みスパイクの適切な処理も重要です。書き込みキューイングを使用してスパイクを管理し、MySQL が安定した持続可能な速度で書き込みを処理できるようにします。アプリケーションがクラッシュして 100,000 の書き込みが蓄積し、復旧時にシステムに一斉に送信される場合、書き込みがキューに入れられて滑らかに処理されれば、メルトダウンを回避できます。

クエリ負荷(平均アクティブセッション)の理解

クエリ負荷は、総クエリ時間を実時間で割ったものです。例えば、300 秒の実時間で 500 秒のクエリ時間の場合、負荷は 1.67 になります。

負荷が 1.0 未満の場合、クエリの同時実行性はありません。負荷が 1.0 より大きい場合は、クエリの同時実行性があることを示します(例:負荷 4.5 は 4-5 の同時実行性を意味します)。より高い負荷は、特にクエリが同じまたは近隣の行にアクセスする場合、より高い競合の可能性を示します。

クエリ負荷が 10 を超える場合、通常、遅くて影響の大きいクエリの強い指標となります。パフォーマンスチューニングにおいて、クエリ負荷を使用して最適化努力を優先順位付けすることができます。

監視と可観測性の違い

効果的な MySQL 管理には、監視 (Monitoring) と可観測性 (Observability) の違いを理解することが重要です。監視は「何が起こっているか」を教えてくれ、可観測性は「なぜそれが起こっているか」を教えてくれます。

監視では、事前定義されたアラート、基本的なメトリクス、静的なダッシュボードを使用します。一方、可観測性では、探索的なアプローチ、根本原因分析、動的なダッシュボードを提供します。

監視と可観測性

Oracle のマルチクラウド O&M (Observability and Management)

現代の監視ソリューションは、マルチクラウド環境をサポートする必要があります。Oracle のソリューションでは、メトリクス、イベント、ログ、トレース、そして SQL という5つの要素から可観測性テレメトリを収集します。

主要な機能には、監視、AIOps/Analytics、診断/チューニング、セキュリティが含まれ、Oracle Cloud、Microsoft Azure、Google Cloud、AWS、そしてオンプレミス環境をサポートしています。

MySQL 管理のためのクラウドサービス

現在、HeatWave とオンプレミス MySQL 向けに GA(一般提供)されているサービスには、統合的な監視・診断機能と予測的洞察機能があります。

統合フリート監視・管理では、オンプレミスとクラウドデータベースの統合監視が可能で、MySQL、Oracle などの異種データベースフリートを監視できます。DevOps 向けには、詳細な可用性、パフォーマンス、設定メトリクスが提供されます。

負荷とパフォーマンス分析も簡単に行えます。高コストなクエリを素早く特定し、クエリアクティビティを可視化して迅速なトラブルシューティングを実現できます。

予測的洞察の面では、SQL Insights が特に注目に値します。これは、機械学習に基づいたパフォーマンス診断洞察を、精選された SQL データに基づいて提供します。洞察は SQL、データベース、フリートレベルで提供され、問題を可視化、検証、調査するためのインタラクティブダッシュボードも用意されています。

さらに、スマートな容量計画機能により、変化するワークロードの需要を予測し、機械学習による季節性モデルを活用して、近期的な問題を自動的に予測できます。

実際の監視画面の活用

実際の監視では、すべての MySQL データベースの統合フリートビューから始まります。ここでは、CPU、メモリ、ストレージ IOPS の観点からリソース消費の概要を把握できます。また、特定の MySQL DB システムにドリルダウンして、視覚化による負荷とパフォーマンス分析を行うことも可能です。

監視画面

メトリクスページでは、利用可能なすべてのメトリクスと詳細なチャートを確認でき、より良い相関分析が可能になります。

メトリクス監視画面

接続ハンドリングの実例

実際のユースケースとして、接続処理の問題を見てみましょう。アクティブ接続(現在実行中のクエリ)とカレント接続(すべてのオープン接続)を比較することで、問題を特定できます。

理想的には、接続を可能な限り迅速にオープン・クローズする紺色の線のような効率的な処理を目指します。一方で接続が蓄積され、アイドル接続がオープンのまま残ってしまう水色の線のような状況は避けたいものです。アイドル接続がクリーンアップされ、アクティブな接続のみが残る状況が理想的です。

接続数グラフ

この監視により、開発者と連携して接続を微調整し、中間層の接続プールメカニズムを最適化することができます。

パフォーマンスハブによる診断

クエリに問題がある場合は、パフォーマンスハブを活用します。これは、アプリケーションのパフォーマンスに影響を与える高コストなクエリを素早く特定できるツールです。

SQL テキスト、メトリクス、その他の詳細情報にドリルダウンでき、スパイク分析のための時間範囲フィルタリングも可能です。MySQL ログに依存することなく、クエリコンテンツとパフォーマンス統計のリアルタイム集約を行い、SQL コード内のパフォーマンス低下の根本原因を直接修正できます。

パフォーマンスハブ

パフォーマンスハブでは、実行時間、ロック時間、検査された行数、送信された行数、影響を受けた行数、選択スキャン、選択フル結合、ソート、実行回数などの、9 つの重要なクエリメトリクスすべてがキャプチャされます。

パフォーマンスハブ - 重要指標

パフォーマンスハブ - 重要指標

クエリをクリックすると、これらの詳細なメトリクスに関する洞察を得ることができ、どこに問題があるのかを正確に特定できます。

スケールするタイミングを判断する

システムをスケールするタイミングを適切に判断することは非常に重要です。より良いハードウェアから始めるのではなく、データを使用して本当に必要な時期を知ることが大切です。

必ずチェックしておくべき項目としては、応答時間が高すぎないか、遅いクエリが最適化されているか、データが削除またはアーカイブされているか、アクセスパターンが見直され最適化されているかなどがあります。

また、少なくともこのうち 2 つをチェックすべき項目として、CPU 使用率が 80% を超えていないか、実行中のスレッド数が CPU コア数を超えていないか、メモリが総データサイズの 10% 未満になっていないか、ストレージ IOPS 使用率が 80% を超えていないかがあります。

予測的洞察の活用

SQL パフォーマンスへの洞察では、ビジネスクリティカルな SQL のパフォーマンス低下を検出し、パフォーマンスを相関させ、データベース間で集約・比較することができます。また、アプリケーションのスケーラビリティと非効率性の問題を特定し、特定の問題を解決するためのカスタム分析によるメトリクスの季節性の傾向と予測も可能です。

このシステムは、原因を検出し、影響を測定し、それらを相関させます。原因にはワークロードの変化や設定の変更が含まれ、影響には SQL の回帰やリソース限界(CPU、I/O、メモリ)への到達が含まれます。

予測的洞察

SQL エクスプローラーによる時系列分析

クエリインサイトでは、迅速な実験とダッシュボード作成のための探索的なクエリ駆動インターフェースを提供します。複数の MySQL データベースにわたる履歴クエリパフォーマンスデータを取得・分析し、時間経過における非効率性を発見し、パフォーマンストレンドを比較できます。

クエリ負荷(平均アクティブセッション)、インデックスのないトップクエリ、ディスクソートのあるトップクエリなどの情報を、時系列で分析することができます。

SQL Explorerでパフォーマンスドリフトを発見

データ駆動型キャパシティプランニング

推測作業を超えて、データ駆動型の容量予測が可能です。CPU、ストレージ、メモリ、I/O のトレンド分析により、最大需要と平均需要の予測、機械学習による季節性モデル、近期的な問題の自動予測を行います。

フリート全体の高速成長データベースの可視性により、インフラストラクチャの適正サイズ化とリソース使用率の最適化に関する洞察と推奨事項を提供します。

キャパシティプランニング

まとめ: MySQL監視の本質

MySQL監視の真の価値は、単なる数値の収集ではなく、ビジネスに意味のある洞察を得ることにあります。

まず、正しい質問の検討から始めることが重要です。なぜパフォーマンスが遅れているのか、クエリの実行、メトリクス、アクセスパターンを詳しく調べてから、クエリの書き換えやハードウェアのスケーリングを検討しましょう。

制御できることを最初に最適化することも大切です。直接的な最適化では、クエリの改良、効果的なインデックスの作成、EXPLAINを使用した改善指導を行います。間接的な最適化では、データ設計の再考、結合戦略の見直し、作業量を最小化するためのリターンセットの調整を行います。

負荷の限界を知ることも重要です。MySQL をより高速にするには、安全な限界内でクエリ応答時間を短縮するか、負荷容量を増加させる必要があります。

可観測性を活用しましょう。監視ツールはアラートのためだけでなく、予測、トレンド分析、より賢明な容量計画を推進するためのものです。

そして、適切なスケーリングを心がけましょう。ハードウェアのアップグレードから始めるのではなく、ツールとテレメトリを使用して、いつ、どのようにスケールするかを決定しましょう。

現代の MySQL 監視は、単なる障害検知ツールから、ビジネス価値を最大化する戦略的資産へと進化しています。本記事で紹介した技術と手法を活用することで、データベース運用の効率性と信頼性を飛躍的に向上させることができるでしょう。成功の鍵は、統合的なアプローチ、予測的な思考、そして継続的な学習と改善にあります。


本記事は、MySQL and HeatWave Summit 2025 で Sriram Vrinda から発表された、”In-depth MySQL Monitoring: From Metrics to Insights” に基づいて作成されました。より詳細な情報については、以下のリソースをご活用ください。

参考リソース

実際に手を動かして学習したい方には、Oracle の LiveLabs が提供されています。HeatWave MySQL 向け外部 MySQL 向けの両方で OCI O & M を体験できます。

また、Database Management と Ops Insights に関する YouTube 動画も公開されており、動画で学習したい方におすすめです。

詳細なドキュメントについては、Database Management Ops Insights の公式ドキュメントが用意されています。