

# 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(Non-Volatile Memory Express) 솔리드 스테이트 드라이브(SSD)에 있습니다. 이 스토리지는 짧은 지연 시간, 높은 임의 I/O 성능, 높은 순차 읽기 처리량(throughput)에 최적화되어 있습니다.

RDS Optimized Reads는 DB 인스턴스 또는 다중 AZ DB 클러스터가 db.m5d 또는 db.m6gd 같은 DB 인스턴스 클래스를 인스턴스 스토어와 함께 사용할 때 기본적으로 켜집니다. RDS Optimized Reads를 사용하면 일부 임시 객체가 인스턴스 스토어에 저장됩니다. 이러한 임시 객체에는 내부 임시 파일, 내부 온디스크 임시 테이블, 메모리 맵 파일, 이진 로그(binlog) 캐시 파일이 포함됩니다. 인스턴스 스토어 유형에 대한 자세한 내용은 *Linux 인스턴스용 Amazon Elastic Compute Cloud 사용 설명서*의 [Amazon EC2 인스턴스 스토어](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html) 섹션을 참조하세요.

쿼리 처리를 위해 MySQL에서 임시 객체를 생성하는 워크로드는 인스턴스 스토어를 활용하여 쿼리를 더 빠르게 처리할 수 있습니다. 이러한 유형의 워크로드에는 정렬, 해시 집계, 고부하 조인, CTE(Common Table Expression) 및 인덱싱되지 않은 열에 대한 쿼리가 포함됩니다. 이러한 인스턴스 스토어 볼륨은 영구 Amazon EBS 스토리지에 사용되는 스토리지 구성과 관계없이 더 높은 IOPS와 성능을 제공합니다. RDS Optimized Reads는 임시 객체에 대한 작업을 인스턴스 스토어로 오프로드하므로 이제 영구 객체에 대한 작업에 영구 스토리지(Amazon EBS)의 초당 입출력 작업 처리량(IOPS) 또는 처리량(throughput)을 사용할 수 있습니다. 이러한 작업에는 일반 데이터 파일 읽기 및 쓰기와 플러싱 및 버퍼 병합 삽입과 같은 백그라운드 엔진 작업이 포함됩니다.

**참고**  
수동 및 자동 RDS 스냅샷에는 영구 객체를 위한 엔진 파일만 포함됩니다. 인스턴스 스토어에서 생성된 임시 객체는 RDS 스냅샷에 포함되지 않습니다.

## RDS Optimized Reads 사용 사례
<a name="rds-optimized-reads-use-cases"></a>

쿼리 실행을 위해 내부 테이블이나 파일 같은 임시 객체에 크게 의존하는 워크로드가 있는 경우 RDS Optimized Reads를 켜는 것이 좋습니다. RDS Optimized Reads의 사용 사례는 다음과 같습니다.
+ 복잡한 CTE(Common Table Expression), 파생된 테이블, 그룹화 작업을 사용하여 분석 쿼리를 실행하는 애플리케이션
+ 최적화되지 않은 쿼리로 많은 읽기 트래픽을 처리하는 읽기 전용 복제본
+ `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 항목을 메모리에 유지합니다. 이 구성은 binlog 항목을 디스크의 임시 binlog 캐시 파일에 쓰는 것을 방지합니다.

  `binlog_cache_size` 파라미터는 세션별로 다릅니다. 새 세션마다 값을 변경할 수 있습니다. 이 파라미터를 설정하면 피크 워크로드 중에 DB 인스턴스의 메모리 사용률을 높일 수 있습니다. 따라서 애플리케이션의 워크로드 패턴과 DB 인스턴스의 가용 메모리를 기반으로 파라미터 값을 높이는 것을 고려해 보세요.
+ MySQL 8.0 버전 이하에서는 `binlog_format` 파라미터에 기본값인 `MIXED`를 사용합니다. 트랜잭션 크기에 따라 `binlog_format`을 `ROW`로 설정하면 인스턴스 스토어에 큰 binlog 캐시 파일이 생성될 수 있습니다. 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) 파라미터를 인스턴스 스토어의 사용 가능한 스토리지 크기에 맞게 설정합니다.
+ 단일 트랜잭션에서 대량 변경을 수행하지 마세요. 이러한 유형의 트랜잭션은 인스턴스 스토어에 대용량 binlog 캐시 파일을 생성할 수 있으며, 인스턴스 스토어가 가득 차면 문제가 발생할 수 있습니다. binlog 캐시 파일의 스토리지 사용을 최소화하려면 쓰기를 여러 개의 작은 트랜잭션으로 분할하는 것이 좋습니다.
+ `ABORT_SERVER` 파라미터에 기본값 `binlog_error_action`를 사용합니다. 이렇게 하면 백업이 활성화된 DB 인스턴스에서 이진 로깅 문제를 방지할 수 있습니다.

## RDS Optimized Reads 사용
<a name="rds-optimized-reads-using"></a>

단일 AZ DB 인스턴스 배포, 다중 AZ DB 인스턴스 배포 또는 다중 AZ DB 클러스터 배포에서 다음 DB 인스턴스 클래스 중 하나를 사용하여 RDS for MySQL DB 인스턴스를 프로비저닝하면 DB 인스턴스는 자동으로 RDS Optimized Reads를 사용합니다.

RDS Optimized Read를 켜려면 다음 중 하나를 수행합니다.
+ 이러한 DB 인스턴스 클래스 중 하나를 사용하여 RDS for MySQL DB 인스턴스 또는 다중 AZ DB 클러스터를 생성합니다. 자세한 내용은 [Amazon RDS DB 인스턴스 생성](USER_CreateDBInstance.md) 단원을 참조하십시오.
+ 이러한 DB 인스턴스 클래스 중 하나를 사용하여 기존 RDS for MySQL DB 인스턴스 또는 다중 AZ DB 클러스터를 수정합니다. 자세한 내용은 [Amazon RDS DB 인스턴스 수정](Overview.DBInstance.Modifying.md) 단원을 참조하십시오.

RDS Optimized Reads는 로컬 NVMe SSD 스토리지가 있는 DB 인스턴스 클래스 중 하나 이상이 지원되는 모든 AWS 리전 RDS에서 사용 가능합니다. DB 인스턴스 클래스에 대한 자세한 내용은 [DB 인스턴스 클래스](Concepts.DBInstanceClass.md) 섹션을 참조하세요.

DB 인스턴스 클래스 가용성은 AWS 리전에 따라 다릅니다. 특정 AWS 리전 클래스에서 DB 인스턴스 클래스가 지원되는지 여부를 확인하려면 [AWS 리전에서 DB 인스턴스 클래스 지원 확인](Concepts.DBInstanceClass.RegionSupport.md)를 참조하세요.

RDS Optimized Reads를 사용하지 않으려면 기능을 지원하는 DB 인스턴스 클래스를 사용하지 않도록 DB 인스턴스 또는 다중 AZ DB 클러스터를 수정하세요.

## RDS Optimized Reads를 사용하는 DB 인스턴스 모니터링
<a name="rds-optimized-reads-monitoring"></a>

다음 CloudWatch 지표를 사용하여 RDS Optimized Reads를 사용하는 DB 인스턴스를 모니터링할 수 있습니다.
+ `FreeLocalStorage`
+ `ReadIOPSLocalStorage`
+ `ReadLatencyLocalStorage`
+ `ReadThroughputLocalStorage`
+ `WriteIOPSLocalStorage`
+ `WriteLatencyLocalStorage`
+ `WriteThroughputLocalStorage`

이러한 지표는 사용 가능한 인스턴스 스토어 스토리지, IOPS 및 처리량(throughput)에 대한 데이터를 제공합니다. 이러한 지표에 대한 자세한 내용은 [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` 값보다 더 많은 스토리지가 필요한 세션은 인스턴스 스토어에 생성된 임시 binlog 캐시 파일에 트랜잭션 변경 사항을 기록합니다.
+ 인스턴스 스토어가 가득 차면 트랜잭션이 실패할 수 있습니다.