문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

쿼리 성능 최적화

이 페이지의 내용

  • 쿼리를 지원하는 인덱스 만들기
  • 네트워크 요구를 줄이기 위해 쿼리 결과 수 제한
  • 프로젝션 사용하여 필요한 데이터만 반환
  • $hint 을 사용하여 특정 인덱스 선택
  • 증분 연산자를 사용하여 서버측에서 작업 수행하기

일반적으로 실행되는 쿼리의 경우 인덱스를 생성하세요. 쿼리가 여러 필드를 검색하는 경우에는 복합 인덱스를 생성하세요. 인덱스를 스캔하는 것이 collection을 스캔하는 것보다 훨씬 빠릅니다. 인덱스 구조는 문서 참조보다 작으며, 참조를 순서대로 저장합니다.

예제

블로그 포스트가 포함된 posts 컬렉션이 있고 author_name 필드에서 포함된정렬하는 쿼리를 정기적으로 실행하는 경우, author_name 필드에 인덱스를 생성하여 쿼리를 최적화할 수 있습니다.

db.posts.createIndex( { author_name : 1 } )

인덱스는 또한 주어진 필드에서 일상적으로 정렬하는 쿼리의 효율성을 향상합니다.

예제

timestamp 필드에서 정렬하는 쿼리를 정기적으로 실행하는 경우 timestamp 필드에 인덱스를 생성하여 쿼리를 최적화할 수 있습니다.

인덱스 만들기:

db.posts.createIndex( { timestamp : 1 } )

쿼리 최적화:

db.posts.find().sort( { timestamp : -1 } )

MongoDB는 오름차순과 내림차순으로 인덱스를 읽을 수 있으므로 단일 키 인덱스의 방향은 중요하지 않습니다.

인덱스는 쿼리, 업데이트 작업 및 집계 파이프라인의 일부 단계를 지원합니다.

BinData 유형의 인덱스 키는 다음과 같은 경우 인덱스에 더 효율적으로 저장됩니다.

  • 이진 하위 유형 값은 0~7 또는 128~135 범위 내에 있습니다.

  • 바이트 배열의 길이는 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24 또는 32입니다.

MongoDB 커서가 여러 문서의 그룹에서 결과를 반환합니다. 원하는 결과의 수를 알고 있는 경우 limit() 메서드를 실행하여 네트워크 리소스 수요를 줄일 수 있습니다.

이는 일반적으로 정렬 작업과 함께 사용됩니다. 예를 들어 posts 컬렉션에 대한 쿼리 결과가 10개만 필요한 경우 다음 명령을 실행합니다.

db.posts.find().sort( { timestamp : -1 } ).limit(10)

결과 제한에 대한 자세한 내용은 다음에서 확인 가능합니다. limit()

문서에서 필드의 서브세트만 필요한 경우, 필요한 필드만 반환하면 더 나은 성능을 얻을 수 있습니다:

예를 들어 posts 컬렉션에 대한 쿼리에서 timestamp, title, author,abstract 필드만 필요한 경우 다음 명령을 실행합니다.

db.posts.find( {}, { timestamp : 1 , title : 1 , author : 1 , abstract : 1} ).sort( { timestamp : -1 } )

프로젝션 사용에 대한 자세한 내용은 쿼리에서 반환할 프로젝트 필드를 참조하세요.

대부분의 경우 쿼리 옵티마이저는 특정 작업에 최적의 인덱스를 선택하지만, hint() 메서드를 사용하여 MongoDB가 특정 인덱스를 사용하도록 강제할 수 있습니다. hint()를 사용하여 성능 테스트를 지원하거나 여러 인덱스에 포함된 필드를 선택해야 하는 경우 일부 쿼리에서 사용합니다.

MongoDB의 $inc 연산자를 사용하여 문서의 값을 늘리거나 줄일 수 있습니다. 연산자는 문서를 선택하고 클라이언트에서 간단한 수정을 수행한 다음 전체 문서를 서버에 쓰는 대신 서버 측에서 필드 값을 증가시킵니다. $inc 연산자는 두 개의 애플리케이션 인스턴스가 동시에 문서를 쿼리하고 필드를 수동으로 증가시킨 후 전체 문서를 다시 저장할 때 발생하는 경합 조건을 방지하는 데도 도움이 됩니다.

← 데이터베이스 프로파일러 출력