내용으로 건너뛰기

Amazon RDS for MySQL에서 느린 쿼리 문제를 해결하고 성능을 개선하려면 어떻게 해야 합니까?

6분 분량
0

Amazon Relational Database Service(Amazon RDS) for MySQL에서 느린 쿼리 문제를 해결하고 성능을 개선하고 싶습니다.

간략한 설명

Amazon RDS에서 다음과 같은 문제로 인해 쿼리 성능이 저하될 수 있습니다.

  • 부적절한 인덱싱 및 비효율적인 버퍼 풀 사용과 같은 워크로드 및 리소스 사용률 문제
  • 비효율적인 쿼리 실행 계획
  • 리소스 경합
  • 트랜잭션 차단

이러한 문제를 해결하려면 Amazon CloudWatch 지표, Performance Insights, Database Insights 및 향상된 모니터링을 검토하여 성능 병목 현상을 식별하십시오. 그런 다음, 병목 문제를 해결하고 쿼리 성능을 최적화하십시오.

해결 방법

중요: Performance Insights는 2026년 6월 30일에 서비스가 종료됩니다. 2026년 6월 30일 이전에 Database Insights의 고급 모드로 업그레이드할 수 있습니다. 업그레이드하지 않으면 Performance Insights를 사용하는 DB 클러스터는 Database Insights의 표준 모드로 기본 설정됩니다. Database Insights의 고급 모드만 실행 계획과 온디맨드 분석을 지원합니다. 클러스터가 표준 모드로 기본 설정된 경우 콘솔에서 이러한 기능을 사용하지 못할 수 있습니다. 고급 모드를 활성화하려면 Amazon RDS용 Database Insights의 고급 모드 활성화Amazon Aurora용 Database Insights의 고급 모드 활성화를 참조하십시오.

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

리소스 및 데이터베이스 성능 모니터링

쿼리 성능 문제를 해결하려면 Amazon CloudWatch 지표를 검토하여 문제의 원인을 파악하십시오. 쿼리로 인해 특정 리소스 사용이 늘어나거나 DB 성능이 저하되는 시기를 확인하려면 CloudWatch 콘솔 또는 AWS CLI를 사용하여 다음 지표를 모니터링하십시오.

  • DatabaseConnections
  • NetworkReceiveThroughput
  • WriteThroughput
  • ReadThroughput
  • WriteLatency
  • ReadLatency
  • WriteIOPS
  • ReadIOPS
  • FreeStorageSpace
  • BurstBalance

DB 성능이 좋지 않은 경우 성능에 영향을 줄 수 있는 활성 프로세스 또는 예약된 프로세스가 있는지 RDS DB 인스턴스 상태를 확인하십시오. 또한 Amazon RDS 이벤트에서 DB 성능에 영향을 줄 수 있는 이벤트를 검토하십시오.

워크로드 및 리소스 사용률 검토

쿼리 성능이 느린 경우 워크로드의 다른 쿼리를 검토하여 쿼리 성능에 영향을 미치는지 확인하십시오. 최적화해야 하는 쿼리를 식별하려면 Amazon RDS 또는 Amazon Aurora용 Database Insights의 고급 모드를 활성화할 수 있습니다.

인스턴스가 다시 시작되면 DB 인스턴스의 캐시된 데이터가 손실되어 쿼리 성능이 저하될 수 있습니다. 이러한 콜드 캐시 문제를 방지하려면 재시작 후 워밍업 버퍼 풀을 가속화하도록 다음 파라미터를 구성하십시오.

  • innodb_buffer_pool_dump_at_shutdown
  • innodb_buffer_pool_load_at_startup
  • innodb_buffer_pool_dump_pct

쿼리 성능을 최적화하려면 DB 인스턴스가 InnoDB 버퍼 풀을 얼마나 활용하는지 모니터링하는 것이 좋습니다. 자세한 내용은 MySQL 웹 사이트의 버퍼 풀을 참조하십시오. InnoDB 버퍼 풀의 상태를 모니터링하려면 다음과 같은 Performance Insights 데이터베이스 카운터를 검토하십시오.

  • 논리적 읽기 요청 수는 Innodb_buffer_pool_read_requests 카운터를 참조하십시오.
  • InnoDB가 버퍼 풀에서 충족할 수 없어 디스크에서 직접 읽어야 하는 논리적 읽기 수는 Innodb_buffer_pool_reads를 참조하십시오.
  • InnoDB가 버퍼 풀에서 충족할 수 있는 읽기 비율은 Innodb_buffer_pool_hit_ratio를 사용하십시오.
  • 데이터 페이지가 포함된 InnoDB 버퍼 풀의 백분율은 Innodb_buffer_pool_usage를 검토하십시오.

실행 속도가 느린 쿼리를 식별하려면 파라미터 그룹에서 slow_query_log를 활성화한 다음, 로그를 CloudWatch Logs에 게시할 수도 있습니다.

쿼리 성능 최적화

쿼리 성능을 최적화하려면 쿼리 실행 계획의 요구 사항에 따라 다음 명령을 실행합니다. 자세한 내용은 MySQL 웹 사이트의 EXPLAIN 출력 형식을 참조하십시오.

EXPLAIN을 사용하여 쿼리 최적화

쿼리 성능 및 쿼리가 지연될 수 있는 이유에 대한 세부 정보를 보려면 EXPLAIN 명령을 실행합니다. 자세한 내용은 MySQL 웹 사이트에서 EXPLAIN을 사용하여 쿼리 최적화를 참조하십시오.

쿼리에서 인덱스를 사용하는지 확인하려면 EXPLAIN 쿼리를 실행합니다. EXPLAIN 출력에서 테이블 이름, 사용 중인 키, 쿼리가 스캔한 행 수를 검토합니다. 자세한 내용은 MySQL 웹 사이트에서 EXPLAIN 문을 참조하십시오. 출력을 검토한 후 다음 작업을 수행하십시오.

  • 출력에 사용 중인 키가 표시되지 않으면 WHERE 절의 열에 인덱스를 만듭니다.
  • 테이블에 필요한 인덱싱이 있는 경우 테이블 통계가 최신 상태인지 확인합니다. 자세한 내용은 MySQL 웹 사이트의 INFORMATION_SCHEMA STATISTICS 테이블을 참조하십시오.

ANALYZE TABLE을 사용하여 쿼리 통계 업데이트

테이블 통계가 최신 상태가 아닌 경우 쿼리 성능이 저하될 수 있습니다. 쿼리 통계를 업데이트하려면 ANALYZE TABLE 명령을 실행합니다. 자세한 내용은 MySQL 웹 사이트의 ANALYZE TABLE 문을 참조하십시오.

EXPLAIN ANALYZE를 사용하여 쿼리 시간 할당 방식 확인

쿼리 실행 중 어느 부분이 느린지 파악하려면 EXPLAIN ANALYZE 쿼리를 실행하여 MySQL이 쿼리에 시간을 어떻게 할당하는지 확인하십시오. 쿼리가 완료되면 EXPLAIN ANALYZE 쿼리는 계획과 측정값을 출력합니다. 자세한 내용은 MySQL 웹 사이트에서 EXPLAIN ANALYZE로 정보 확보를 참조하십시오. SHOW PROFILE을 사용하여 속도가 느린 쿼리를 프로파일링하고 세션에서 가장 많은 시간을 소비하는 상태를 찾을 수도 있습니다. 자세한 내용은 MySQL 웹 사이트의 SHOW PROFILE 문을 참조하십시오.

SHOW FULL PROCESSLIST 및 향상된 모니터링을 사용하여 작업 검토

SHOW FULL PROCESSLIST 명령을 실행하여 데이터베이스 서버에서 수행되는 작업 목록을 확인합니다. 향상된 모니터링을 사용하여 이 목록을 검토할 수도 있습니다. 자세한 내용은 MySQL 웹 사이트의 SHOW PROCESSLIST 문을 참조하십시오.

기록 목록 길이 확인

InnoDB 트랜잭션 시스템은 다중 버전 동시성 제어(MVCC)를 유지합니다. 워크로드에 여러 개의 미완료 또는 장기 실행 트랜잭션이 필요한 경우 데이터베이스의 기록 목록 길이가 증가할 것입니다. 데이터베이스에서 열린 트랜잭션이나 장기 실행 트랜잭션을 방지하는 것이 좋습니다. 자세한 내용은 InnoDB 기록 목록 길이가 크게 늘어났음을 참조하십시오.

기록 목록 길이를 모니터링하지 않으면 시간이 지남에 따라 성능이 저하됩니다. 기록 목록 길이가 길면 리소스 사용률이 높아지고, SELECT 성능이 느려지고 일관성이 떨어지며 스토리지가 증가할 수도 있습니다.

참고: 장기 실행 트랜잭션이 기록 목록 길이 급증의 유일한 원인은 아닙니다. 제거 스레드가 데이터베이스의 변경 사항과 일치하지 않는 경우 기록 목록 길이가 계속해서 길어집니다. 극단적인 경우에는 데이터베이스가 중단될 수도 있습니다.

SHOW ENGINE INNODB STATUS 명령은 트랜잭션 처리, 대기 이벤트 및 교착 상태에 대한 정보를 표시합니다. 자세한 내용은 MySQL 웹 사이트의 SHOW ENGINE 문을 참조하십시오. SHOW ENGINE INNODB STATUS 쿼리를 실행하여 기록 목록 길이를 확인합니다.

SHOW ENGINE INNODB STATUS;

출력 예시:

\------------ TRANSACTIONS ------------Trx id counter 26368570695  Purge done for
 trx's n:o < 26168770192 undo n:o < 0 state: running but idle History list length 1839

Performance Insights를 사용하여 기록 목록 길이를 확인하려면 다음 단계를 완료하십시오.

  1. Amazon RDS 콘솔을 엽니다.
  2. 탐색 창에서 Performance Insights를 선택한 다음, 지표를 보려는 데이터베이스를 선택합니다.
  3. 지표를 선택합니다.
  4. 지표 대시보드 페이지에서 사용자 지정 대시보드를 선택합니다.
  5. 위젯 추가를 선택한 다음, Trx Rseg History Len 지표를 선택합니다.
  6. 위젯 추가를 선택합니다.

참고: 데이터 조작 언어(DML) 쓰기로 인해 기록 목록 길이가 늘어나는 경우 데이터베이스 관리자에게 쓰기 쿼리를 종료하도록 요청하십시오.

차단된 쿼리 해결

쿼리가 장기간 실행되는 경우 다른 쿼리가 해당 쿼리를 차단하고 있을 수 있습니다. MySQL 8.0에서는 data_lock_waits 테이블의 성능 스키마에서 잠금 대기를 찾을 수 있습니다. 자세한 내용은 MySQL 웹 사이트의 InnoDB 트랜잭션 사용 및 잠금 정보를 참조하십시오. 다음 쿼리를 실행하여 차단 트랜잭션을 식별합니다.

SELECT
  r.trx\_id waiting\_trx\_id,    
  r.trx\_mysql\_thread\_id waiting\_thread,      
  r.trx\_query waiting\_query,    
  b.trx\_id blocking\_trx\_id,    
  b.trx\_mysql\_thread\_id blocking\_thread,    
  b.trx\_query blocking\_query    
FROM       performance\_schema.data\_lock\_waits w    
INNER JOIN information\_schema.innodb\_trx b    
  ON b.trx\_id = w.blocking\_engine\_transaction\_id    
INNER JOIN information\_schema.innodb\_trx r    
  ON r.trx\_id = w.requesting\_engine\_transaction\_id;

관련 정보

스토리지가 가득 찬 것으로 표시되는 RDS for MySQL 또는 MariaDB 인스턴스 문제를 해결하려면 어떻게 해야 합니까?

다른 활성 세션이 없는데 Amazon RDS for MySQL DB 인스턴스에 대한 쿼리가 차단된 이유는 무엇입니까?

AWS 공식업데이트됨 9달 전
댓글 없음