

# Amazon RDS Optimized Reads による RDS for MySQL のクエリパフォーマンスの向上
<a name="rds-optimized-reads"></a>

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

**Topics**
+ [RDS Optimized Reads の概要](#rds-optimized-reads-overview)
+ [RDS Optimized Reads のユースケース](#rds-optimized-reads-use-cases)
+ [RDS Optimized Reads のベストプラクティス](#rds-optimized-reads-best-practices)
+ [RDS Optimized Reads の使用](#rds-optimized-reads-using)
+ [RDS Optimized Reads を使用する DB インスタンスのモニタリング](#rds-optimized-reads-monitoring)
+ [RDS Optimized Reads についての制限事項](#rds-optimized-reads-limitations)

## RDS Optimized Reads の概要
<a name="rds-optimized-reads-overview"></a>

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 インスタンスストア](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html)」を参照してください。

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

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

## RDS Optimized Reads のユースケース
<a name="rds-optimized-reads-use-cases"></a>

クエリの実行を内部テーブルやファイルなどの一時オブジェクトに大きく依存するワークロードがある場合は、RDS Optimized Reads を有効にすると便利です。RDS Optimized Reads の候補となるユースケースは次のとおりです。
+ 複雑なテーブル共通式 (CTE)、派生テーブル、グループ化オペレーションを使用して分析クエリを実行するアプリケーション
+ 最適化されていないクエリで大量の読み取りトラフィックを処理するリードレプリカ
+ `GROUP BY` 句や `ORDER BY` 句を含むクエリなど、複雑なオペレーションを伴うオンデマンドまたは動的レポートクエリを実行するアプリケーション
+ クエリ処理に内部テンポラリテーブルを使用するワークロード

  エンジンステータス変数 `created_tmp_disk_tables` をモニタリングすることで、DB インスタンスに作成されたディスクベースの一時テーブルの数を判断できます。
+ 中間結果を格納するために、直接またはプロシージャ内で大規模な一時テーブルを作成するアプリケーション
+ インデックス付けされていない列をグループ化または順序付けするデータベースクエリ

## RDS Optimized Reads のベストプラクティス
<a name="rds-optimized-reads-best-practices"></a>

RDS Optimized Reads を使用するベストプラクティスは次のとおりです。
+ インスタンスストアが実行中にストレージ不足によって失敗した場合に備えて、読み取り専用クエリの再試行ロジックを追加します。
+ CloudWatch メトリクスの `FreeLocalStorage` を使用して、インスタンスストアで使用可能なストレージ容量をモニタリングします。DB インスタンスのワークロードが原因でインスタンスストアが上限に達している場合は、より大きな DB インスタンスクラスを使用するように DB インスタンスを変更します。
+ DB インスタンスまたはマルチ AZ DB クラスターに十分なメモリがあるのにインスタンスストアのストレージ制限に達している場合は、`binlog_cache_size` 値を増やしてセッション固有のバイナリログエントリをメモリに保持します。この設定により、ディスク上の一時バイナリログキャッシュファイルにバイナリログエントリの書き込みを防止します。

  `binlog_cache_size` パラメータはセッション固有です。この値は、新しいセッションごとに変更できます。このパラメータを設定すると、ピーク負荷時に DB インスタンスのメモリ使用量が増加する可能性があります。そのため、アプリケーションのワークロードのパターンと DB インスタンスで使用可能なメモリに基づいてパラメータ値を増やすことを検討してください。
+ MySQL バージョン 8.0 以前の場合、`binlog_format` パラメータのデフォルト値に `MIXED` の値を使用します。トランザクションのサイズによっては、`binlog_format` を `ROW` に設定すると、インスタンスストアのバイナリログキャッシュファイルが大きくなる可能性があります。MySQL 8.4 以降の場合、`binlog_format` パラメータのデフォルト値に `ROW` の値を使用します。
+ [internal\$1tmp\$1mem\$1storage\$1engine](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_internal_tmp_mem_storage_engine) パラメータを `TempTable` に設定し、[temptable\$1max\$1mmap](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_mmap) パラメータをインスタンスストアで使用可能なストレージのサイズと一致するように設定します。
+ 1 つのトランザクションで大量の変更を実行することは避けてください。このような種類のトランザクションでは、インスタンスストアに大きなバイナリログキャッシュファイルが生成され、インスタンスストアが満杯になると問題が発生する可能性があります。バイナリログキャッシュファイルのストレージ使用量を最小限に抑えるために、書き込みを複数の小さなトランザクションに分割することを検討してください。
+ `binlog_error_action` パラメータには `ABORT_SERVER` のデフォルト値を使用してください。そうすることで、バックアップが有効になっている DB インスタンスのバイナリログに関する問題を回避できます。

## RDS Optimized Reads の使用
<a name="rds-optimized-reads-using"></a>

シングル 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 インスタンスの作成](USER_CreateDBInstance.md)」を参照してください。
+ これらの DB インスタンスクラスの 1 つを使用して、既存の RDS for MySQL DB インスタンスまたはマルチ AZ DB クラスターを変更します。詳細については、「[Amazon RDS DB インスタンスを変更する](Overview.DBInstance.Modifying.md)」を参照してください。

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

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

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

## RDS Optimized Reads を使用する DB インスタンスのモニタリング
<a name="rds-optimized-reads-monitoring"></a>

RDS Optimized Reads を使用する DB インスタンスは、次の CloudWatch メトリクスでモニタリングできます。
+ `FreeLocalStorage`
+ `ReadIOPSLocalStorage`
+ `ReadLatencyLocalStorage`
+ `ReadThroughputLocalStorage`
+ `WriteIOPSLocalStorage`
+ `WriteLatencyLocalStorage`
+ `WriteThroughputLocalStorage`

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

## RDS Optimized Reads についての制限事項
<a name="rds-optimized-reads-limitations"></a>

RDS Optimized Reads には次の制限事項が適用されます。
+ RDS Optimized Reads は、以下のバージョンでサポートされています。
  + RDS for MySQL 8.0.28 以降のメジャーバージョンとマイナーバージョン

  RDS for MySQL のバージョンの詳細については、「[Amazon RDS での MySQL のバージョン](MySQL.Concepts.VersionMgmt.md)」を参照してください。
+ RDS Optimized Reads をサポートする DB インスタンスクラスでは、一時オブジェクトの場所を永続ストレージ (Amazon EBS) に変更することはできません。
+ DB インスタンスでバイナリロギングが有効になっている場合、最大トランザクションサイズはインスタンスストアのサイズによって制限されます。MySQL では、`binlog_cache_size` の値よりも多くのストレージを必要とするセッションでは、インスタンスストアに作成される一時的なバイナリログキャッシュファイルにトランザクションの変更が書き込まれます。
+ トランザクションは、インスタンスストアが満杯になるとエラーになる可能性があります。