Amazon RDS Optimized Reads による RDS for MySQL のクエリパフォーマンスの向上 - Amazon Relational Database Service

Amazon RDS Optimized Reads による RDS for MySQL のクエリパフォーマンスの向上

Amazon RDS Optimized Reads によって、RDS for MySQL の高速クエリ処理を実現できます。RDS Optimized Reads を使用する RDS for MySQL DB インスタンスまたはマルチ AZ DB クラスターは、これを使用しない DB インスタンスまたはクラスターに比べて、クエリ処理を最大 2 倍高速化できます。

RDS Optimized Reads の概要

RDS Optimized Reads が有効になっている RDS for MySQL DB インスタンスまたはマルチ AZ DB クラスターを使用する場合、インスタンスストアを使用することでクエリのパフォーマンスが高速化されます。インスタンスストアは、DB インスタンスまたはマルチ AZ DB クラスターに一時ブロックレベルのストレージを提供します。ストレージは、ホストサーバーに物理的にアタッチされた不揮発性メモリエクスプレス (NVMe) によるソリッドステートドライブ (SSD) にあります。このストレージは、低レイテンシー、優れたランダム I/O パフォーマンス、高いシーケンシャル読み取りスループットを実現するために最適化されています。

DB インスタンスまたはマルチ AZ DB クラスターが db.m5d や db.m6gd などのインスタンスストアを含む DB インスタンスクラスを使用する場合、RDS Optimized Reads はデフォルトで有効になっています。RDS Optimized Reads では、一部の一時オブジェクトがインスタンスストアに保存されます。これらの一時オブジェクトには、内部一時ファイル、内部オンディスク一時テーブル、メモリマップファイル、バイナリログ (binlog) キャッシュファイルが含まれます。インスタンスストアの詳細については、Linux インスタンス向け Amazon Elastic Compute Cloud ユーザーガイドの「Amazon EC2 インスタンスストア」を参照してください。

MySQL でクエリ処理用の一時オブジェクトを生成するワークロードは、インスタンスストアを利用してクエリ処理を高速化できます。このタイプのワークロードには、ソート、ハッシュ集約、高負荷結合、共通テーブル式 (CTE)、インデックス付けされていない列に対するクエリが含まれます。これらのインスタンスストアボリュームによって、永続的な Amazon EBS ストレージに使用されるストレージ設定に関係なく、より高い IOPS とパフォーマンスを提供します。RDS Optimized Reads は一時オブジェクトのオペレーションをインスタンスストアにオフロードするため、永続的ストレージ (Amazon EBS) の 1 秒あたりの入出力オペレーション (IOPS) またはスループットを、永続オブジェクトのオペレーションに使用できるようになりました。これらのオペレーションには、通常のデータファイルの読み取りと書き込み、フラッシュやバッファ挿入のマージなどのバックグラウンドエンジンオペレーションが含まれます。

注記

手動の RDS スナップショットと自動の RDS スナップショットの両方に含まれているのは、永続オブジェクトのエンジンファイルのみです。インスタンスストアで作成された一時オブジェクトは RDS スナップショットには含まれません。

RDS Optimized Reads のユースケース

クエリの実行を内部テーブルやファイルなどの一時オブジェクトに大きく依存するワークロードがある場合は、RDS Optimized Reads を有効にすると便利です。RDS Optimized Reads の候補となるユースケースは次のとおりです。

  • 複雑なテーブル共通式 (CTE)、派生テーブル、グループ化オペレーションを使用して分析クエリを実行するアプリケーション

  • 最適化されていないクエリで大量の読み取りトラフィックを処理するリードレプリカ

  • GROUP BY 句や ORDER BY 句を含むクエリなど、複雑なオペレーションを伴うオンデマンドまたは動的レポートクエリを実行するアプリケーション

  • クエリ処理に内部テンポラリテーブルを使用するワークロード

    エンジンステータス変数 created_tmp_disk_tables をモニタリングすることで、DB インスタンスに作成されたディスクベースの一時テーブルの数を判断できます。

  • 中間結果を格納するために、直接またはプロシージャ内で大規模な一時テーブルを作成するアプリケーション

  • インデックス付けされていない列をグループ化または順序付けするデータベースクエリ

RDS Optimized Reads のベストプラクティス

RDS Optimized Reads を使用するベストプラクティスは次のとおりです。

  • インスタンスストアが実行中にストレージ不足によって失敗した場合に備えて、読み取り専用クエリの再試行ロジックを追加します。

  • CloudWatch メトリクスの FreeLocalStorage を使用して、インスタンスストアで使用可能なストレージ容量をモニタリングします。DB インスタンスのワークロードが原因でインスタンスストアが上限に達している場合は、より大きな DB インスタンスクラスを使用するように DB インスタンスを変更します。

  • DB インスタンスまたはマルチ AZ DB クラスターに十分なメモリがあるのにインスタンスストアのストレージ制限に達している場合は、binlog_cache_size 値を増やしてセッション固有のバイナリログエントリをメモリに保持します。この設定により、ディスク上の一時バイナリログキャッシュファイルにバイナリログエントリの書き込みを防止します。

    binlog_cache_size パラメータはセッション固有です。この値は、新しいセッションごとに変更できます。このパラメータを設定すると、ピーク負荷時に DB インスタンスのメモリ使用量が増加する可能性があります。そのため、アプリケーションのワークロードのパターンと DB インスタンスで使用可能なメモリに基づいてパラメータ値を増やすことを検討してください。

  • binlog_format には MIXED のデフォルト値を使用します。トランザクションのサイズによっては、binlog_formatROW に設定すると、インスタンスストアのバイナリログキャッシュファイルが大きくなる可能性があります。

  • internal_tmp_mem_storage_engine パラメータを TempTable に設定し、temptable_max_mmap パラメータをインスタンスストアで使用可能なストレージのサイズと一致するように設定します。

  • 1 つのトランザクションで大量の変更を実行することは避けてください。このような種類のトランザクションでは、インスタンスストアに大きなバイナリログキャッシュファイルが生成され、インスタンスストアが満杯になると問題が発生する可能性があります。バイナリログキャッシュファイルのストレージ使用量を最小限に抑えるために、書き込みを複数の小さなトランザクションに分割することを検討してください。

  • binlog_error_action パラメータには ABORT_SERVER のデフォルト値を使用してください。そうすることで、バックアップが有効になっている DB インスタンスのバイナリログに関する問題を回避できます。

RDS Optimized Reads の使用

シングル AZ DB インスタンスデプロイ、マルチ AZ DB インスタンスデプロイまたは Multi-AZ DB クラスターデプロイで、次の DB インスタンスクラスのいずれかを使用して RDS for MySQL DB インスタンスをプロビジョニングすると、DB インスタンスは自動的に RDS Optimized Reads を使用します。

RDS Optimized Reads をオンにするには、次のいずれかの操作を行います。

  • これらの DB インスタンスクラスの 1 つを使用して、RDS for MySQL DB インスタンスまたはマルチ AZ DB クラスターを作成します。詳細については、「Amazon RDS DB インスタンスの作成」を参照してください。

  • これらの DB インスタンスクラスの 1 つを使用して、既存の RDS for MySQL DB インスタンスまたはマルチ AZ DB クラスターを変更します。詳細については、「Amazon RDS DB インスタンスを変更する」を参照してください。

RDS Optimized Reads は、ローカル NVMe SSD ストレージのある DB インスタンスクラスの 1 つ以上がサポートされているすべての AWS リージョン RDS で使用できます。DB インスタンスクラスの詳細については、「 DB インスタンスクラス」を参照してください。

DB インスタンスクラスの可用性は AWS リージョン によって異なります。DB インスタンスクラスが特定の AWS リージョン でサポートされているかどうかを判断するには、「AWS リージョン での DB インスタンスクラスのサポートを決定する」を参照してください。

RDS Optimized Reads を使用しない場合は、この機能をサポートする DB インスタンスクラスを使用しないように DB インスタンスまたはマルチ AZ DB クラスターを変更してください。

RDS Optimized Reads を使用する DB インスタンスのモニタリング

RDS Optimized Reads を使用する DB インスタンスは、次の CloudWatch メトリクスでモニタリングできます。

  • FreeLocalStorage

  • ReadIOPSLocalStorage

  • ReadLatencyLocalStorage

  • ReadThroughputLocalStorage

  • WriteIOPSLocalStorage

  • WriteLatencyLocalStorage

  • WriteThroughputLocalStorage

これらのメトリクスでは、利用可能なインスタンスストアストレージ、IOPS、スループットに関するデータを提供します。これらのメトリクスの詳細については、「Amazon RDS の Amazon CloudWatch インスタンスレベルのメトリクス」を参照してください。

RDS Optimized Reads についての制限事項

RDS Optimized Reads には次の制限事項が適用されます。

  • RDS Optimized Reads は、RDS for MySQL バージョン 8.0.28 以降でサポートされています。RDS for MySQL のバージョンの詳細については、「Amazon RDS での MySQL のバージョン」を参照してください。

  • RDS Optimized Reads をサポートする DB インスタンスクラスでは、一時オブジェクトの場所を永続ストレージ (Amazon EBS) に変更することはできません。

  • DB インスタンスでバイナリロギングが有効になっている場合、最大トランザクションサイズはインスタンスストアのサイズによって制限されます。MySQL では、binlog_cache_size の値よりも多くのストレージを必要とするセッションでは、インスタンスストアに作成される一時的なバイナリログキャッシュファイルにトランザクションの変更が書き込まれます。

  • トランザクションは、インスタンスストアが満杯になるとエラーになる可能性があります。