データベースは、あらゆるアプリケーションのパフォーマンスにおいて重要な役割を果たします。MySQL データベースも例外ではありません。したがって、データベースのチューニング、設計、構成がアプリケーションのパフォーマンス向上に役立つさまざまな方法を理解することが重要です。最適なパフォーマンスを達成するために MySQL を最適化する方法をいくつか紹介します。
クエリの調整
データベースのパフォーマンス調整はアプリケーションから開始します。ビジネス要件をどのようにデータベース クエリに変換するかによって、アプリケーションの複雑さと効率が大きく変わります。パフォーマンスの真の指標は、各データベース インスタンスがどれだけ効率的にビジネスニーズに貢献しているかです。
スキーマの設計
リレーショナル データベースでエンティティと関係がどのように定義されているかによって、データベース クエリに対するレスポンスがどれほど単純か、または複雑かが決まります。また、主キーとセカンダリ インデックスをどのように定義するかも重要な役割を果たします。
サーバーの設定
サーバー構成は、システム リソースの使用率を最適化して最大化する役割を担います。システム リソースとは、コア プロセッシング ユニット(CPU)コア、物理マシンまたは仮想マシン(VM)上のメモリ、基盤となるストレージ システム、ネットワークのことです。
動的なサーバー調整
データベースのワークロードを実際の動向に合わせて調整するための継続的なモニタリング、最適化、パフォーマンス調整。
この記事では、クエリの調整に焦点を当てます。その他のトピックについては、後続の記事で説明します。
多くの場合、クエリ チューニング プロセスは、データベース クエリを確認することから始まります。よりよい方法は、ビジネス要件がデータベース クエリにどれだけ効率的に変換されているかを評価することから始めることです。クエリに対するビジネスニーズの解釈と処理によって、費用がどの程度の少額になるか、または大きくなるかが決まります。
最初のステップでは、クエリを最適化して優先順位を付けます。
この 2 つのカテゴリは、データベース スキーマの設計時に最適化する必要があります。
トランザクションは、含まれているすべてのステートメントが完全に commit またはロールバックされる論理単位です。トランザクションは、MySQL でアトミック性、整合性、独立性、永続性(ACID)を実現する機能です。
MySQL のストレージ エンジンである InnoDB では、すべてのユーザー アクティビティがトランザクション内で発生します。デフォルトでは、自動 commit モードが有効になっています。つまり、各 SQL ステートメントが単独で 1 つのトランザクションを形成します。自動コミットが有効になっている場合に複数ステートメント トランザクションを実行するには、START_TRANSACTION または BEGIN でトランザクションを明示的に開始し、COMMIT または ROLLBACK を使用して終了します。自動 commit モードが無効になっている場合、COMMIT または ROLLBACK によってトランザクションが終了して新しいトランザクションが開始されるまで、セッションは常にトランザクションを開いたままにします。
トランザクションのベスト プラクティスは、できる限り短くすることです。これは、長い取引には、この記事で詳述されているようにいくつかの欠点があるためです。
クエリは、アプリケーション側またはデータベース側でキャプチャできます。
開発では、データベース クエリとクエリの実行時間をログに記録することをおすすめします。アプリケーション側のロギングにより、ビジネス コンテキストにおけるクエリの効果と効率を簡単に評価できます。たとえば、すべてのクエリの応答時間や、特定の機能の応答時間を記録するなどです。マルチステートメント トランザクションの合計実行時間も簡単に取得できます。
また、アプリケーション側のロギングから測定されたクエリ レスポンス時間は、ネットワーク時間を含むエンドツーエンドの測定値です。これにより、データベースからログに記録されたクエリの実行時間が補完され、問題がネットワークの問題とデータベースのどちらによるものかを簡単に特定できるようになります。
Cloud SQL MySQL Query Insights
Cloud SQL の Query Insights ツールを使用すると、クエリのキャプチャ、モニタリング、診断を行うことができます。
Query Insights では、実行時間と実行頻度に基づいて、上位のクエリを簡単に見つけることができます。
このツールには、期間、データベース、ユーザー アカウント、クライアント アドレスなどのフィルタ オプションがあり、CPU 使用率、IO およびロック待機の内訳を示すグラフを表示できます。「上位のクエリとタグ」の表には、正規化された実行時間の上位のクエリが一覧表示されます。実行時間のほかに、「スキャンされた平均行数」と「返された平均行数」の統計情報が表示されるため、クエリの効率に関する分析情報が得られます。
このツールの全機能と有効にする方法については、こちらのドキュメントをご覧ください。
パフォーマンス スキーマを使用する
Cloud SQL for MySQL では、メモリが 15 GB 以上の MySQL 8.0 以降のバージョンで 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 クエリの分析情報では、EXPLAIN プランに簡単にアクセスできます。
出力で何を探しますか?
セッション ステータス変数を使用して、クエリ実行の詳細を取得できます。
まず、セッション変数をクリアしてから、クエリを実行してカウンタを確認します。たとえば、Handler_* ステータスはデータアクセス パターンと行数を示します。Created_* は、一時テーブルやディスク上の一時テーブルが作成された場合に表示されます。Sort_* は、並べ替えたマージパスの数と並べ替えられた行数を表示します。その他のセッション変数については、ドキュメントをご覧ください。
SHOW PROFILE ステートメントは、実行ステージごとのクエリ実行時間を提供します。これは有益な情報になることもあります。
クエリ実行プランを理解した後は、複数の方法でそれに影響を与えて最適化できます。
特定のクエリに対してサーバー設定を最適化するには、すべてのセッションに影響するグローバル値を変更するのではなく、セッション レベルの変数を使用することを強くおすすめします。
よく使用されるセッション値は次のとおりです。
まとめると、クエリの調整に関しては、次の 3 つの側面について説明しました。