データベースは、あらゆるアプリケーションのパフォーマンスにおいて重要な役割を果たします。MySQL データベースも例外ではありません。したがって、データベースの調整、設計、構成がアプリケーションのパフォーマンス向上に役立つさまざまな方法を理解することが重要です。MySQL を最適化して最適なパフォーマンスを実現する方法を以下に示します。
クエリの調整
データベースのパフォーマンス調整はアプリケーションから開始されます。アプリケーションがどのようにビジネス要件をデータベース クエリに変換するかによって、アプリケーションの複雑さと効率は大きく変わります。パフォーマンスの本当の尺度は、各データベース インスタンスがどの程度効率的にビジネスニーズに貢献しているかです。
スキーマの設計
リレーショナル データベースでエンティティとリレーションをどのように定義するかによって、データベース クエリに対するレスポンスがどの程度単純または複雑であるかが異なります。また、主キーとセカンダリ インデックスの定義方法も重要な役割を果たします。
サーバーの設定
サーバーの構成は、システム リソースの使用率を最適化し、最大化する役割を担います。システム リソースは、コア プロセッシング ユニット(CPU)コア、物理マシンまたは仮想マシン(VM)のメモリ、基盤となるストレージ システム、ネットワークで構成されます。
動的なサーバー調整
継続的なモニタリング、最適化、パフォーマンス調整により、データベースのワークロードを現実世界の動向に適応させます。
この記事では、クエリの調整に焦点を当てます。その他のトピックについては、後続の記事で取り上げます。
多くの場合、クエリの調整プロセスは、データベースのクエリを確認することから始まります。より適切な方法は、ビジネス要件がどの程度効率的にデータベース クエリに変換されているかを最初に評価することです。クエリに対するビジネスニーズの解釈と処理によって、費用がどの程度削減されるか高額になるかが異なります。
最初のステップでは、クエリを最適化して優先順位を付けます。
これら 2 つのカテゴリは、データベース スキーマの設計時に最適化する必要があります。
トランザクションとは、含まれているすべてのステートメントが完全に commit されるか、ロールバックされる論理単位です。トランザクションは、MySQL にアトミック性、整合性、独立性、耐久性(ACID)を付与する機能です。
MySQL のストレージ エンジンである InnoDB では、すべてのユーザー アクティビティがトランザクション内で発生します。デフォルトでは、自動 commit モードが有効になっています。つまり、各 SQL ステートメントは独自に単一のトランザクションを形成します。自動コミットが有効になっている場合に複数ステートメント トランザクションを実行するには、START_TRANSACTION または START_TRANSACTION でトランザクションを明示的に開始し、START_TRANSACTION または START_TRANSACTION を使用して終了します。自動 commit モードが無効になっている場合は、COMMIT または ROLLBACK によってトランザクションが終了し、新しいトランザクションが開始されるまで、セッションは常に開かれています。
トランザクションに関しては、できるだけ短くすることをおすすめします。これは、この記事で詳しく説明しているように、長時間のトランザクションにはいくつかのデメリットがあるためです。
1. 長時間にわたるロック競合により、クエリの速度が低下し、クエリが失敗する可能性がある
2. 大量の undo ログによりサーバーのパフォーマンスが低下する
3. ディスク使用量の増加
4. シャットダウン時間が長くなる
5. クラッシュリカバリ時間が長くなる
クエリは、アプリケーション側またはデータベース側でキャプチャできます。
開発手法として、データベース クエリとクエリの実行時間をログに記録することをおすすめします。アプリケーション側のロギングにより、ビジネス コンテキストにおけるクエリの効果と効率を簡単に評価できます。たとえば、ユーザーはすべてのクエリの応答時間をログに記録したり、特定の機能に関する応答時間をログに記録したりできます。これはマルチステートメント トランザクションの合計実行時間を簡単に取得できる方法でもあります。
また、アプリケーション側のロギングで測定されるクエリの応答時間は、ネットワーク時間を含むエンドツーエンドの測定値です。ログに記録されるデータベースに対するクエリ実行時間を補完し、ネットワークとデータベースのどちらに問題があるのかを簡単に特定できるようにします。
Cloud SQL MySQL Query Insights
Cloud SQL の Query Insights ツールを使用すると、クエリのキャプチャ、モニタリング、診断を行うことができます。
Query Insights では、実行時間と実行頻度に基づいて、上位のクエリを簡単に見つけることができます。
このツールには、期間、データベース、ユーザー アカウント、クライアント アドレスなどのフィルタ オプションがあり、CPU 使用率、IO およびロック待機の内訳を示すグラフを表示できます。「上位のクエリとタグ」の表には、正規化された実行時間の上位のクエリが一覧表示されます。実行時間のほかに、「スキャンされた平均行数」と「返された平均行数」の統計情報が表示されるため、クエリの効率に関する分析情報が得られます。
このツールの全機能と有効にする方法については、こちらのドキュメントをご覧ください。
パフォーマンス スキーマを使用する
Cloud SQL for MySQL では、メモリが 15 GB 以上の MySQL 8.0.26 以降のバージョンで performance_schema 機能がデフォルトで有効になっています。この機能を有効または無効にするには、インスタンスの再起動が必要です。
performance_schema=ON の場合、クエリ ステートメントの計測がデフォルトで有効になります。sys.statement_analysis テーブルは、正規化されたクエリの集計統計情報を示し、次のような疑問の解決に役立ちます。
MySQL Workbench を使用している場合、sys ビューに基づくパフォーマンス スキーマ レポートが作成されます。このレポートには、クエリのパフォーマンスに関する分析情報を示す「高コストの SQL ステートメント」のセクションがあります。
スローログとツールを使用する
スローログには、long_query_time より長く実行されているすべてのクエリがキャプチャされます。また、クエリの実行時間、ロック時間、確認されたデータ行、送信されたデータ行もログに記録されます。実行統計情報が追加されているため、一般的なログを使用するよりもデータベース クエリを分析するのに適しています。
スローログを有効にすることをおすすめします。通常、long_query_time は、調査と最適化を行うクエリをキャプチャするために適切なしきい値に保っておく必要があります。
log_output=FILE
slow_query_log=ON
long_query_time=2
時には、long_query_time=0 を設定して、すべてのクエリを短時間キャプチャし、クエリの量とパフォーマンスの概要を取得することをおすすめします。
クエリの統計情報を表示するために、クエリ シグネチャを抽出してレポートを生成する mysqldumpslow や pt-query-digest などのツールがあります。
クエリ統計情報に関するレポートを生成するサードパーティのモニタリング ツールには、Percona Monitoring and Management、SolarWinds のDatabase Performance Monitor(以前の VividCortex)などがあります。
トランザクションでクエリをキャプチャしたら、次にクエリを最適化します。
EXPLAIN コマンドはクエリ実行プランを提供し、8.0.18 以降では EXPLAIN ANALYZE コマンドはステートメントを実行し、実行からタイミングとともに EXPLAIN 出力を生成します。
MySQL Query Insights を使用すると、EXPLAIN プランに簡単にアクセスできます。
出力で何を探しますか?
セッション ステータス変数を使用して、クエリ実行の詳細情報を取得できます。
まず、セッション変数を消去してから、クエリを実行してカウンタを確認します。たとえば、Handler_* ステータスはデータアクセス パターンと行数を示します。Created_* は、一時テーブルまたはディスク上の一時テーブルが作成された場合に表示されます。Sort_* は、並べ替えのマージパスの数と並べ替えられた行数を表示します。その他のセッション変数については、こちらのドキュメントをご覧ください。
SHOW PROFILE ステートメントは、実行ステージごとのクエリ実行時間を提供します。これは有益な情報になることもあります。
クエリ実行プランを理解したら、プランに影響を与えて、最適化する方法は複数あります。
特定のクエリに合わせてサーバー構成を最適化するには、すべてのセッションに影響するグローバル値を変更するのではなく、セッション レベルの変数を使用することを強くおすすめします。
よく使用されるセッション値は次のとおりです。
まとめると、クエリの調整について、次の 3 つの側面について説明しました。