기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
쿼리 조정 가이드
워크로드에서 문제가 있는 쿼리를 식별한 후에는 각 쿼리를 조정해야 합니다. 다음 튜닝 가이드를 사용하면 워크로드를 더 효율적으로 실행할 수 있습니다.
스캔한 행 수 최소화
기본적인 것처럼 보이지만 쿼리를 조정할 때 유용한 조언입니다. EXPLAIN 문을 사용하고 행 열을 검토하여 최적화 프로그램이 각 조인에서 스캔하는 행 수를 확인합니다. 최적의 인덱스를 만들어 스캔되는 행 수를 줄인 다음 쿼리를 다시 설명하여 제대로 작동하는지 확인합니다. 자세한 내용은 MySQL 설명서
파티션된 테이블을 사용하는 경우 최적화 프로그램이 각 파티션을 스캔하지 않아도 되도록 파티션 정리를 활성화하는 WHERE 절을 사용하여 항상 테이블을 쿼리합니다. WHERE 절에 파티션된 열의 상수가 포함되어 있는 경우 최적화 프로그램은 어떤 파티션을 찾아야 하는지 알고 있으므로 쿼리의 효율성을 높일 수 있습니다.
이 조언의 또 다른 측면은 데이터베이스 설계입니다. 쿼리에 테이블 수가 적을수록 쿼리 속도가 빨라집니다. 데이터베이스 설계를 비정규화할 수 있는 경우 최적화 프로그램이 스캔하는 행 수를 줄여 쿼리 성능을 높일 수 있습니다.
임시 테이블 사용량 및 디스크의 임시 테이블 최소화
Aurora MySQL 호환 최적화 프로그램은 인덱스에서 원하는 쿼리 결과를 직접 얻을 수 없는 경우 RAM과 디스크 모두에 임시 테이블을 생성합니다. 따라서 조정의 상당 부분은 워크로드에 적합한 올바른 인덱스를 확보하는 것입니다. 하지만 워크로드에 인덱스에만 의존할 수 없는 쿼리가 있을 수 있으므로 일부 작업은 임시 파일에서 수행될 수 있습니다. 이를 최소한으로 유지하고 디스크에 테이블이 거의 생성되지 않는 한 괜찮습니다. 임시 테이블의 크기가 너무 커서 메모리에 저장할 수 없으면 MySQL이 디스크 테이블을 생성합니다. MySQL이 내부 임시 테이블의 크기를 확인하는 데 사용하는 로직은 두 변수 tmp_table_size와 max-heap-table-size의 값 중 더 작은 값입니다. 이러한 변수를 워크로드에 따라 최적의 값으로 조정하여 임시 테이블을 방지할 수 없는 경우 드문 경우에만 디스크로 푸시할 수 있습니다.
파일 정렬 방지
워크로드에 ORDER BY 쿼리가 많은 경우 이를 해결하는 가장 좋은 방법은 테이블에 올바른 인덱스를 사용하는 것입니다. 파일 정렬을 방지하려면 다중 열 인덱스가 제대로 설계되었는지 확인합니다. 이전 열을 상수로 스캔하지 않으면 해당 열에 대한 정렬이 수행되지 않습니다. in, >, <, != 및 BETWEEN은 오른쪽 다음 열에 대한 정렬을 허용하지 않습니다. MySQL에서 정렬하는 최적의 방법은 쿼리에 제공된 상수 값이 포함된 열을 연속 구조의 정렬 열 왼쪽에 배치하는 다중 열 인덱스를 배치하는 것입니다. 마지막 방법으로 쿼리가 파일 정렬 없이 결과를 반환할 수 없는 경우 정렬을 애플리케이션으로 이동합니다.
동시성이 높은 집계 쿼리 실행 방지
워크로드에 애플리케이션 내 일부 기능을 충족하기 위한 소수의 집계 쿼리가 있을 수 있습니다. 이 사용 사례에는 많은 주의가 필요합니다. InnoDB 엔진은 적절한 온라인 트랜잭션 처리(OLTP) 로드에 적합하지만 높은 동시성에 대한 몇 개의 그룹별 쿼리라도 CPU에 큰 부담을 주고 클러스터의 성능을 급속히 저하시킬 수 있습니다. 집계된 결과 세트가 필요한 사용 사례를 해결하려면 쿼리별로 그룹화하는 것을 피할 수 있도록 읽을 준비가 된 테이블에 데이터를 미리 집계합니다.
쿼리의 동시성 테스트
개별 쿼리를 조정할 때 이러한 쿼리는 Aurora MySQL 호환의 여러 vCPU에서 동시에 실행된다는 점을 기억하세요. 테스트 환경에서 한 번 실행해도 쿼리가 몇 밀리초 안에 실행될 수 있습니다. 하지만 이것이 전부는 아닙니다. 프로덕션 클러스터의 예상 동시성 수준으로 쿼리를 테스트하고 성능을 벤치마크해야 합니다. 동시 실행 목표를 충족할 때만 쿼리를 프로덕션으로 릴리스하세요. 캐시에서 결과를 가져오는 것을 방지하려면 테스트 스크립트에서 최적화 프로그램 hint sql_no_cache를 사용해야 합니다. mysqlslap과 같은 도구를 사용하여 동시에 테스트를 수행하고 결과를 벤치마크할 수 있습니다.