인덱스 에 쿼리 에서 스캔한 모든 필드가 포함된 경우 인덱스 가 쿼리 를 포함합니다. 커버된 쿼리 는 컬렉션 이 아닌 인덱스 를 스캔하므로 쿼리 성능이 향상됩니다.
쿼리된 필드의 하위 집합이 인덱싱된 경우 인덱스는 쿼리를 부분적으로 지원 수도 있습니다.
이 작업에 대하여
단일 컬렉션 에는 최대 64 개의 인덱스가 있을 수 있습니다. 그러나 인덱스가 너무 많으면 해당 제한에 도달하기 전에 성능이 저하될 수 있습니다. 쓰기 대 읽기 비율이 높은 컬렉션의 경우 각 삽입은 인덱스도 업데이트 해야 하므로 성능이 저하될 수 있습니다.
단계
일반적인 쿼리 식별
애플리케이션 에서 일반적인 쿼리 패턴을 식별하려면 $queryStats 집계 단계를 사용합니다. $queryStats 는 공유 필드를 기반으로 쿼리를 그룹 하는 쿼리 형태 에 대한 지표 를 보고합니다.
일반적인 쿼리를 지원 하는 인덱스 생성
애플리케이션 에서 자주 쿼리하는 필드를 파악한 후에는 해당 필드에 대한 쿼리를 지원 인덱스를 생성할 수 있습니다. 자세한 내용은 예시를 참조하세요.
인덱스 사용 분석
애플리케이션 에서 인덱스를 사용하기 시작한 후에는 인덱스의 효율성을 분석 할 수 있습니다. 인덱스 통계 및 사용량을 보려면 다음을 수행하세요.
$indexStats집계 단계를 사용합니다.MongoDB Atlas 배포서버의 경우, Atlas UI 에서 인덱스 를 확인하세요.
애플리케이션 성능을 개선하려면 사용하지 않는 인덱스를 삭제하는 것이 좋습니다. 자세한 내용은 불필요한 인덱스 제거를 참조하세요.
인덱스가 현재 워크로드 를 지원 하는지 확인하려면 이 절차를 주기적으로 반복합니다.
예시
이 페이지의 예제에서는 sample_mflix 샘플 데이터 세트 의 데이터를 사용합니다. 이 데이터 세트를 자체 관리형 MongoDB deployment 에 로드하는 방법에 대한 자세한 내용은 샘플 데이터 세트 로드를 참조하세요. 샘플 데이터베이스를 수정한 경우 이 페이지의 예제를 실행 하려면 데이터베이스를 삭제하고 다시 만들어야 할 수 있습니다.
참고
movies 컬렉션 의 문서에는 여기에 표시되지 않은 추가 필드가 포함되어 있습니다.
단일 키 인덱스 만들기
애플리케이션 이 특정 컬렉션의 단일 키에 대해서만 쿼리하는 경우 해당 컬렉션 에 대한 단일 키 인덱스 를 생성해야 컬렉션. 예를 예시 movies 컬렉션 에서 title 에 대한 인덱스 를 만들 수 있습니다.
db.movies.createIndex( { title: 1 } )
이 인덱스 다음 쿼리 지원합니다.
db.movies.find( { title: 'Mulholland Drive' } )
복합 색인 만들기
애플리케이션 이 단일 키와 여러 키 모두에 대해 쿼리를 수행하는 경우, 복합 인덱스 가 단일 키 인덱스 보다 더 효율적입니다. 예를 예시 year, runtime 및 title 필드에 인덱스 를 생성할 수 있습니다.
db.movies.createIndex( { year: 1, runtime: 1, title: 1 } )
인덱스 접두사
복합 인덱스 인덱싱된 필드의 시작 하위 집합인 인덱스 접두사에 대한 쿼리를 지원합니다. 예시 들어, 앞의 인덱스 이 쿼리 지원합니다.
db.movies.find( { year: 2012, runtime: { $gt: Decimal128( "120" ) } }, { title: 1 } )
인덱스 접두사에 대한 자세한 내용 및 성능 고려 사항은 인덱스 접두사를 참조하세요 .
$text 쿼리를 지원하는 인덱스 만들기
MongoDB 에서 호스팅되는 데이터의 경우, MongoDB 검색 인덱스를 사용하여 전체 텍스트 지원 수 있습니다. 자세한 학습 은 MongoDB 검색 인덱스 생성을 참조하세요.
(Atlas가 아닌) 자체 관리 배포서버의 경우, MongoDB 는 컬렉션 에서 string 콘텐츠 검색을 지원하는 text 인덱스 유형을 제공합니다. 자체 관리형 텍스트 인덱스에 학습 보려면 자체 관리형 배포의 텍스트 인덱스를 참조하세요.
벡터 검색 인덱스 만들기
벡터 검색 인덱스는 벡터 임베딩에 대한 쿼리를 지원 합니다. 벡터 검색 인덱스를 만들려면 벡터 검색 을 위한 인덱스 필드를 참조하세요.
인덱스 사용 및 데이터 정렬
문자열 비교에 인덱스 사용하려면 작업에서 동일한 데이터 정렬도 지정해야 합니다. 작업에서 인덱스 지정한 것과 다른 데이터 정렬을 지정하는 경우 인덱스 는 인덱싱된 필드에서 문자열 비교를 지원 수 없습니다.
경고
데이터 정렬이 없는 인덱스의 경우 데이터 정렬 인식 인덱스 키가 인덱스 키보다 클 수 있는데, 데이터 정렬로 구성된 인덱스는 정렬 순서를 달성하기 위해 ICU 데이터 정렬 키를 사용하기 때문입니다.
문자열 비교를 위해 데이터 정렬 국가 및 언어 설정 "fr" 인 sample_mflix 데이터베이스 의 movies 컬렉션 에 인덱스 생성하려면 다음 코드를 사용합니다.
db.movies.createIndex( { title: 1 }, { collation: { locale: "fr" } } )
인덱스 와 동일한 데이터 정렬을 지정하는 다음 쿼리 인덱스 사용할 수 있습니다.
db.movies.find( { title: "Les Misèrables" }, { title: 1, year: 1 } ).collation( { locale: "fr" } )
그러나 기본값 으로 "simple" 바이너리 데이터 정렬기를 사용하는 다음 쿼리 작업은 인덱스 를 사용할 수 없으며 COLLSCAN이(가) 필요합니다.
db.movies.find( { title: "Les Misèrables" }, { title: 1 , year: 1 } )
인덱스 접두사 키가 문자열, 배열 및 내장된 문서가 아닌 복합 인덱스의 경우, 다른 데이터 정렬을 지정하는 작업에서도 인덱스를 사용하여 인덱스 접두사 키에 대한 비교를 지원할 수 있습니다.
예시 들어, 다음 코드를 사용하여 sample_mflix 데이터베이스 의 movies 컬렉션 에 숫자 필드 year 및 metacritic 과 문자열 필드 title를 지정하는 복합 인덱스 만들 수 있습니다. 인덱스 문자열 비교를 위한 데이터 정렬 국가 및 언어 설정 "fr" 도 지정합니다.
db.movies.createIndex( { year: 1, metacritic: 1, title: 1 }, { collation: { locale: "fr" } } )
문자열 비교에 "simple" 이진 데이터 정렬을 사용하는 다음 작업에서는 인덱스를 사용할 수 있습니다.
db.movies.find( { year: 2012 }, { title: 1, year: 1, metacritic: 1 } ).sort( { title: 1 } )
db.movies.find( { year: 2012, metacritic: { $gt: Decimal128( "50" ) } }, { title: 1, year: 1, metacritic: 1 } ).sort( { title: 1 } )
색인이 생성된 title 필드의 문자열 비교를 위해 "simple" 이진 데이터 정렬을 사용하는 다음 작업은 색인을 사용하여 쿼리의 year: 2012 부분만 수행할 수 있습니다.
db.movies.find( { year: 2012, title: "Les Misèrables" }, { year: 1, title: 1 } )
쿼리 인덱스 사용했는지 확인하려면 explain() 옵션을 사용하여 쿼리 실행 .
중요
내장된 문서 키를 포함한 내장된 문서 키와의 일치는 단순 이진 비교를 사용합니다. 즉, 'type.cafe'와 같은 키에 대한 쿼리 'type.cafe' 키와 일치하지 않습니다. 강도 매개변수에 설정하다 값에 관계없이