Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

프로덕션에서 느린 쿼리 문제 해결

이 페이지에서는 느린 쿼리의 일반적인 원인과 해결 방법을 설명합니다. 다음 섹션을 진행한 후에도 추가 지원 필요한 경우 기술 지원팀 문의 .

배포서버 에서 느린 쿼리 관련 문제가 발생했는지 확인하려면 다음을 확인하세요.

쿼리가 실제로 느린지 확인하려면 현재 쿼리 지연 시간 과거 기준 또는 서비스 수준 목표와 비교하세요. 속도 저하가 일정하게 유지되는지, 아니면 로드 스파이크, 배치 작업 또는 유지 관리 기간과 같은 특정 로드 패턴 중에 발생하는지 식별합니다.

데이터베이스 프로파일러느린 쿼리 로그를 사용하여 네임스페이스, 패턴, 지연 시간 기준으로 특정 작업을 식별합니다.

Atlas 의 경우 Performance Advisor쿼리 프로파일러 사용하여 실행 시간이 긴 쿼리를 찾을 수 있습니다.

클러스터 및 노드 상태를 확인합니다. 다음 항목에 문제가 있는지 확인합니다.

  • 프라이머리/ 세컨더리 상태

  • 복제 지연

  • 빈번한 투표

  • 노드 가용성

  • 페일오버

  • Node restarts

  • 느린 쿼리 기간과 동시에 발생하는 저장 오류

각 노드 에서 CPU, 메모리, 디스크 I/O 및 디스크 사용률을 검사하여 지속적인 포화가 없는지 확인합니다. 자세한 내용은 자체 관리형 MongoDB 배포 모니터링을 참조하세요.

Atlas 에서지표 보드를 검토 쿼리가 느린 시점에 CPU, IOPS, 연결 및 페이지 오류가 급증했는지 확인합니다.

다음과 같이 느린 쿼리와 동시에 최근 변경 사항이 발생했는지 확인합니다.

  • 애플리케이션 릴리스

  • 인덱스 변경 사항

  • 스키마 마이그레이션

  • 배포 크기 조정

  • 매개변수 변경

다음 섹션에서는 쿼리 속도가 느린 일반적인 원인과 해결 방법을 설명합니다.

다음과 같은 인덱싱 문제로 인해 쿼리 속도가 느려질 수 있습니다.

컬렉션 스캔을 수행하거나 비선택적 인덱스를 사용하는 explain "executionStats" “allPlansExecution” 쿼리는 프로덕션 로드에서 높은 지연 시간 유발할 수 있습니다. 높은 상세도를 위해 또는 옵션과 함께 를 사용하여 예상 인덱스 사용하지 않는 쿼리를 식별합니다. 이 옵션은 평가 단계의 모든 계획에 대한 실행 지표 표시합니다. 쿼리 결과를 필터하다 하고 정렬하는 데 사용되는 필드에 대한 인덱스를 만들거나 구체화합니다.

sort() 인덱스 사용할 수 없는 가 포함된 쿼리에는 인메모리 정렬이 필요합니다. 특히 결과 집합이 큰 경우 속도가 느립니다. 다음을 통해 성능을 개선할 수 있습니다.

  • 쿼리 필터하다 및 정렬 패턴과 일치하는 복합 인덱스 만들기

  • 정렬 전 결과 설정하다 크기 줄이기

집계 $match 파이프라인은, 또는 기타 선택적$sort 단계를 초기에 사용하여 데이터 세트를 필터하다 하고 메모리에서 대량의 데이터를 처리 하지 않도록 해야 합니다. 파이프라인 후기 또는 단계가 있는 경우 가능하면 $match $sort 이를 더 일찍 이동합니다.

초기 파이프라인 단계에서 사용되는 필드에 인덱스를 생성하여 성능을 개선할 수도 있습니다.

다음 스키마 및 쿼리 설계 문제로 인해 쿼리 속도가 느려질 수 있습니다.

매우 큰 문서, 제한 없는 배열, 고도로 중첩된 구조는 작업당 I/O와 CPU를 증가시킵니다. 비정상적으로 큰 문서나 넓은 배열이 있는 컬렉션을 식별하고 가능한 경우 버킷팅 또는 참조를 사용하도록 스키마 업데이트하여 성능을 향상시킬 수 있습니다.

대규모 컬렉션이나 시간 범위를 스캔하는 쿼리는 엄격한 필터와 제한을 시행하다 쿼리보다 느립니다. 다음과 같은 방법으로 쿼리 성능을 개선할 수 있습니다.

  • 선택적 필터 추가 및 쿼리된 필드 인덱싱

  • 큰 또는 skip() limit() 조합 대신 페이지 매김 패턴 사용

  • time-series 데이터의 시간 창을 좁히거나, 너무 작은 경우 기본 컬렉션 자체의 세분성을 조정합니다.

일부 쿼리 연산자 및 패턴으로 인해 MongoDB 인덱스를 효율적으로 사용하지 못할 수 있습니다.

  • $regex 선행 와일드카드 사용

  • $nin

  • 매우 큰 $in 목록

  • 과도한 브랜치 $or

  • $ne 인덱스 스캔에 부정적인 영향 부정 방정식

성능을 향상시키려면 술어를 인덱스 친화적으로 다시 작성하세요. 가능한 경우 고정된 정규식 및 미리 계산된 필드를 고려하세요.

느린 쿼리는 프로덕션 로드에서 기본 hardware 리소스에 대한 경합으로 인해 발생할 수 있습니다. 쿼리 지연 시간 급증과 CPU, IOPS 및 캐시 사용률 지표 간에 상관 관계가 있는지 확인합니다. 쿼리가 이미 최적화된 경우 수직 및/또는 수평 확장 또는 워크로드 재분배를 고려하세요.

장기 실행 작업은 다른 쿼리를 차단 하거나 방해할 수 있습니다. 예시 들면 다음과 같습니다.

  • 대규모 인덱스 빌드

  • 컬렉션 스캔

  • 헤비 쓰기

를 사용하여 차단 또는 장기 실행 작업을 식별합니다. 유지 관리 기간에는 과중한 작업을 예약하는 것이 좋습니다. 예시 를 들어 유지 관리 기간 동안 대규모 컬렉션에서 인덱스 빌드를 실행 $currentOp 좋습니다.

복제 지연 있거나 hardware 성능이 낮은 세컨더리로 쿼리가 라우팅되면 응답 속도가 느려질 수 있습니다. 운전자 읽기 설정 및 쓰기 (write) 고려를 검토합니다. 지연 시간이 중요한 쿼리가 적절한 노드로 전달되도록 합니다.

  • 대표 쿼리를 다시 실행하고 이전 결과 및 원하는 목표와 지연 시간 비교합니다.

  • explain("executionStats") 에서 검사하는 문서 수가 줄어들고 인덱스 사용이 개선되는 등 작업량이 감소했는지 확인합니다.

  • 프로파일러 및 느린 쿼리 로그를 검토하여 다음 중 하나를 확인합니다.

    • 이전 느린 쿼리는 더 이상 표시되지 않습니다.

    • 쿼리 시간과 리소스 사용량이 감소했습니다.

  • Atlas 배포의 경우 변경 후 쿼리 및 클러스터 수준 지표 정상 범위로 돌아갔는지 확인합니다.

추가 지원 필요한 경우 다음 정보를 수집합니다.

  • 전체 필터하다 와 적용 가능한 모든 프로젝션, 정렬 및 옵션을 포함하는 느린 쿼리를 샘플링합니다.

    • 대략적인 빈도

    • 예상 지연 시간 대 관찰된 지연 시간

  • explain("executionStats") 대표적인 느린 쿼리에 대한 출력

  • 속도 저하가 발생하는 기간을 다루는 관련 로그 발췌문 및 프로파일러 샘플

  • 최근 변경 사항:

    • 스키마 또는 인덱스

    • 배포 크기, 계층 또는 토폴로지

    • 애플리케이션 출시하다 또는 쿼리 패턴

  • 느린 쿼리 시점의 CPU, 메모리, 디스크 I/O 및 연결 사용량을 보여주는 클러스터 지표 또는 호스트 수준 통계입니다.

  • 배포서버 환경에 대한 세부 정보:

    • Atlas 와 자체 관리

    • 하드웨어 프로필

    • 샤딩 구성

    • 복제 구성

돌아가기

느린 쿼리 차단

이 페이지의 내용