

# 使用 Amazon RDS 优化读取提高 RDS for MariaDB 的查询性能
<a name="rds-optimized-reads-mariadb"></a>

使用 Amazon RDS 优化读取，您可以更快地处理 RDS for MariaDB 查询。与不使用 RDS 优化读取的数据库实例相比，使用 RDS 优化读取的 RDS for MariaDB 数据库实例可以实现最多快 2 倍的查询处理速度。

**Topics**
+ [RDS 优化读取概述](#rds-optimized-reads-mariadb-overview)
+ [RDS 优化读取的使用案例](#rds-optimized-reads-mariadb-use-cases)
+ [RDS 优化读取的最佳实践](#rds-optimized-reads-mariadb-best-practices)
+ [使用 RDS 优化读取](#rds-optimized-reads-mariadb-using)
+ [监控使用 RDS 优化读取的数据库实例](#rds-optimized-reads-mariadb-monitoring)
+ [RDS 优化读取的限制](#rds-optimized-reads-mariadb-limitations)

## RDS 优化读取概述
<a name="rds-optimized-reads-mariadb-overview"></a>

当您使用开启了 RDS 优化读取的 RRDS for MariaDB 数据库实例时，您的数据库实例通过使用实例存储实现更快的查询性能。*实例存储*为数据库实例提供临时性块级存储。存储位于物理上附加到主机服务器的非易失性存储规范（NVMe）固态硬盘（SSD）上。此存储针对低延迟、高随机输入/输出性能和高速连续读取吞吐量进行了优化。

默认情况下，当数据库实例使用带有实例存储的数据库实例类（例如 db.m5d 或 db.m6gd）时，RDS 优化读取处于开启状态。使用 RDS 优化读取，一些临时对象存储在实例存储中。这些临时对象包括内部临时文件、内部磁盘上的临时表、内存映射文件和二进制日志（binlog）缓存文件。有关实例存储的更多信息，请参阅《适用于 Linux 实例的 Amazon Elastic Compute Cloud 用户指南》**中的 [Amazon EC2 实例存储](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html)。

在 MariaDB 中生成用于查询处理的临时对象的工作负载可以利用实例存储来加快查询处理速度。此类工作负载包括涉及排序、哈希聚合、高负载联接、公用表表达式（CTE）的查询以及对未索引列的查询。无论用于持久 Amazon EBS 存储的存储配置如何，这些实例存储卷都能提供更高的 IOPS 和性能。由于 RDS 优化读取将对临时对象的操作分载到实例存储，因此永久存储（Amazon EBS）的每秒进行读写操作的次数（IOPS）或吞吐量现在可用于对永久对象进行的操作。这些操作包括常规数据文件读取和写入以及后台引擎操作，例如刷新和插入缓冲区合并。

**注意**  
手动和自动 RDS 快照仅包含用于永久对象的引擎文件。在实例存储中创建的临时对象不包含在 RDS 快照中。

## RDS 优化读取的使用案例
<a name="rds-optimized-reads-mariadb-use-cases"></a>

如果您的工作负载严重依赖于临时对象（例如内部表或文件）来执行查询，那么启用 RDS 优化读取会给您带来好处。以下使用案例是 RDS 优化读取的候选使用案例：
+ 使用复杂的公用表表达式（CTE）、派生表和分组操作运行分析查询的应用程序
+ 通过未优化的查询提供大量读取流量的只读副本
+ 运行涉及复杂操作（例如，带 `GROUP BY` 和 `ORDER BY` 子句的查询）的按需或动态报告查询的应用程序
+ 使用内部临时表进行查询处理的工作负载

  您可以监控引擎状态变量 `created_tmp_disk_tables`，以确定在数据库实例上创建的基于磁盘的临时表的数量。
+ 直接或在过程中创建大型临时表以存储中间结果的应用程序
+ 对非索引列执行分组或排序的数据库查询

## RDS 优化读取的最佳实践
<a name="rds-optimized-reads-mariadb-best-practices"></a>

对于 RDS 优化读取使用以下最佳实践：
+ 为只读查询添加重试逻辑，以防它们在执行过程中由于实例存储已满而失败。
+ 使用 CloudWatch 指标 `FreeLocalStorage` 监控实例存储上的可用存储空间。如果由于数据库实例上的工作负载导致实例存储达到其极限，请修改数据库实例以使用更大的数据库实例类。
+ 当您的数据库实例有足够的内存但仍达到实例存储上的存储限制时，增加 `binlog_cache_size` 值以将特定于会话的二进制日志条目保留在内存中。此配置可防止将二进制日志条目写入磁盘上的临时二进制日志缓存文件。

  `binlog_cache_size` 参数是特定于会话的。您可以更改每个新会话的值。此参数的设置可以提高高峰工作负载期间数据库实例的内存利用率。因此，请考虑根据应用程序的工作负载模式和数据库实例上的可用内存增加参数值。
+ 对 `binlog_format` 使用 `MIXED` 的默认值。根据事务的大小，将 `binlog_format` 设置为 `ROW` 可能会导致实例存储上的二进制日志缓存文件很大。
+ 避免在单个事务中进行批量更改。这些类型的事务会在实例存储上生成大型二进制日志缓存文件，并在实例存储已满时导致问题。考虑将写入分成多个小事务，以显著减少二进制日志缓存文件的存储使用量。

## 使用 RDS 优化读取
<a name="rds-optimized-reads-mariadb-using"></a>

当您在单可用区数据库实例部署或多可用区数据库实例部署中预调配具有以下数据库实例类之一的 RDS for MariaDB 数据库实例时，该数据库实例会自动使用 RDS 优化型读取功能。

要启用 RDS 优化读取，请执行以下操作之一：
+ 使用其中一个数据库实例类创建 RDS for MariaDB 数据库实例。有关更多信息，请参阅 [创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)。
+ 修改现有 RDS for MariaDB 数据库实例以使用其中一个数据库实例类。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

在支持其中一个或多个数据库实例类（具有本地 NVMe SSD 存储）的所有 AWS 区域中，均可使用 RDS 优化型读取功能。有关数据库实例类的信息，请参阅 [数据库实例类](Concepts.DBInstanceClass.md)。

数据库实例类可用性因 AWS 区域而异。要确定特定 AWS 区域中是否支持数据库实例类，请参阅[确定 AWS 区域 中的数据库实例类支持](Concepts.DBInstanceClass.RegionSupport.md)。

如果您不想使用 RDS 优化读取，请修改您的数据库实例，使其不使用支持该特征的数据库实例类。

## 监控使用 RDS 优化读取的数据库实例
<a name="rds-optimized-reads-mariadb-monitoring"></a>

您可以使用以下 CloudWatch 指标监控使用 RDS 优化读取的数据库实例：
+ `FreeLocalStorage`
+ `ReadIOPSLocalStorage`
+ `ReadLatencyLocalStorage`
+ `ReadThroughputLocalStorage`
+ `WriteIOPSLocalStorage`
+ `WriteLatencyLocalStorage`
+ `WriteThroughputLocalStorage`

这些指标提供有关可用实例存储的存储空间、IOPS 和吞吐量的数据。有关这些指标的更多信息，请参阅。[Amazon RDS 的 Amazon CloudWatch 实例级指标](rds-metrics.md#rds-cw-metrics-instance)

## RDS 优化读取的限制
<a name="rds-optimized-reads-mariadb-limitations"></a>

以下限制适用于 RDS 优化读取：
+ 以下 RDS for MariaDB 版本支持 RDS 优化读取：
  + 11.4 及更高主要版本的所有可用次要版本
  + 10.11.4 及更高的 10.11 版本
  + 10.6.7 和更高的 10.6 版本
  + 10.5.16 和更高的 10.5 版本
  + 10.4.25 和更高的 10.4 版本

  有关 RDS for MariaDB 版本的信息，请参阅 [Amazon RDS 上的 MariaDB 版本](MariaDB.Concepts.VersionMgmt.md)。
+ 您无法在支持 RDS 优化读取的数据库实例类上将临时对象的位置更改为永久存储（Amazon EBS）。
+ 在数据库实例上启用二进制日志记录时，最大事务大小受实例存储大小的限制。在 MariaDB 中，任何需要的存储空间比 `binlog_cache_size` 值更多的会话都会将事务更改写入临时二进制日志缓存文件，这些文件是在实例存储上创建的。
+ 实例存储已满时，事务可能会失败。