쿼리 성능 최적화
이 페이지의 내용
쿼리를 지원하는 인덱스 만들기
일반적으로 실행되는 쿼리의 경우 인덱스 를 만듭니다. 쿼리 가 여러 필드를 검색하는 경우 복합 인덱스 를 만듭니다. 인덱스 를 스캔하는 것이 컬렉션 을 스캔하는 것보다 훨씬 빠릅니다. 인덱스 구조는 문서 참조보다 작으며, 참조를 순서대로 저장 합니다.
예시
블로그 포스트가 포함된 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
를 사용하여 특정 인덱스 선택
대부분의 경우 쿼리 옵티마이저는 특정 작업에 최적의 인덱스를 선택하지만, hint()
메서드를 사용하여 MongoDB가 특정 인덱스를 사용하도록 강제할 수 있습니다. hint()
를 사용하여 성능 테스트를 지원하거나 여러 인덱스에 포함된 필드를 선택해야 하는 경우 일부 쿼리에서 사용합니다.
증분 연산자를 사용하여 서버측에서 작업 수행하기
MongoDB의 $inc
연산자를 사용하여 문서의 값을 늘리거나 줄일 수 있습니다. 연산자는 문서를 선택하고 클라이언트에서 간단한 수정을 수행한 다음 전체 문서를 서버에 쓰는 대신 서버 측에서 필드 값을 증가시킵니다. $inc
연산자는 두 개의 애플리케이션 인스턴스가 동시에 문서를 쿼리하고 필드를 수동으로 증가시킨 후 전체 문서를 다시 저장할 때 발생하는 경쟁 상태를 방지하는 데도 도움이 됩니다.