Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ /

쿼리를 지원하는 인덱스 생성

이 페이지의 내용

  • 이 작업에 대하여
  • 단계
  • 예제
  • 자세히 알아보기

인덱스 에 쿼리 에서 스캔한 모든 필드가 포함된 경우 인덱스 가 쿼리 를 포함합니다. 커버된 쿼리 는 컬렉션 이 아닌 인덱스 를 스캔하므로 쿼리 성능이 향상됩니다.

쿼리된 필드의 하위 집합이 인덱싱된 경우 인덱스는 쿼리를 부분적으로 지원 수도 있습니다.

단일 컬렉션 에는 최대 64 개의 인덱스가 있을 수 있습니다. 그러나 인덱스가 너무 많으면 해당 제한에 도달하기 전에 성능이 저하될 수 있습니다. 쓰기 대 읽기 비율이 높은 컬렉션의 경우 각 삽입은 인덱스도 업데이트 해야 하므로 성능이 저하될 수 있습니다.

1

애플리케이션 에서 일반적인 쿼리 패턴을 식별하려면 $queryStats 집계 단계를 사용합니다. $queryStats 는 공유 필드를 기반으로 쿼리를 그룹 하는 쿼리 형태 에 대한 지표 를 보고합니다.

2

애플리케이션 에서 자주 쿼리하는 필드를 파악한 후에는 해당 필드에 대한 쿼리를 지원 인덱스를 생성할 수 있습니다. 자세한 내용은 예시를 참조하세요.

3

애플리케이션 에서 인덱스를 사용하기 시작한 후에는 인덱스의 효율성을 분석 할 수 있습니다. 인덱스 통계 및 사용량을 보려면 다음을 수행하세요.

  • $indexStats 집계 단계를 사용합니다.

  • MongoDB Atlas 배포서버의 경우, Atlas UI 에서 인덱스 를 확인하세요.

애플리케이션 성능을 개선하려면 사용하지 않는 인덱스를 삭제하는 것이 좋습니다. 자세한 내용은 불필요한 인덱스 제거를 참조하세요.

인덱스가 현재 워크로드 를 지원 하는지 확인하려면 이 절차를 주기적으로 반복합니다.

애플리케이션 이 특정 컬렉션의 단일 키에 대해서만 쿼리하는 경우 해당 컬렉션 에 대한 단일 키 인덱스 를 생성해야 컬렉션. 예를 예시 product 컬렉션 에서 category 에 대한 인덱스 를 만들 수 있습니다.

db.products.createIndex( { category: 1 } )

앞의 인덱스 는 이 쿼리 를 지원합니다.

db.products.find( { category: "electronics" } )

애플리케이션 이 단일 키와 여러 키 모두에 대해 쿼리를 수행하는 경우, 복합 인덱스 가 단일 키 인덱스 보다 더 효율적입니다. 예를 예시 category, itemlocation 필드에 인덱스 를 생성할 수 있습니다.

db.products.createIndex( { category: 1, item: 1, location: 1 } )

복합 인덱스 는 인덱싱된 필드의 시작 하위 집합인 인덱스 접두사에 대한 쿼리를 지원합니다. 예를 예시 앞의 인덱스 는 이러한 쿼리를 지원합니다.

db.products.find( { category: "electronics" } )
db.products.find( { category: "electronics", item: "television" } )

인덱스 접두사에 대한 자세한 내용 및 성능 고려 사항은 인덱스 접두사를 참조하세요 .

MongoDB Atlas에서 호스팅되는 데이터의 경우 Atlas Search 인덱스를 사용하여 전체 텍스트 검색을 지원할 수 있습니다. 자세한 내용은 Atlas Search 인덱스 생성을 참조하세요.

(Atlas가 아닌) 자체 관리 배포서버의 경우, MongoDB는 컬렉션에서 문자열 콘텐츠 검색을 지원하는 text 인덱스 유형을 제공합니다. 자체 관리형 텍스트 인덱스에 대해 자세히 알아보려면 자체 관리형 배포서버의 텍스트 인덱스를 참조하세요.

벡터 검색 인덱스는 벡터 임베딩에 대한 쿼리를 지원 합니다. 벡터 검색 인덱스를 만들려면 벡터 검색 을 위한 인덱스 필드를 참조하세요.

문자열 비교에 인덱스를 사용하려면 작업에서 동일한 데이터 정렬도 지정해야 합니다. 즉, 작업에서 다른 데이터 정렬을 지정하는 경우 데이터 정렬이 있는 인덱스는 인덱싱된 필드에서 문자열 비교를 수행하는 작업을 지원할 수 없습니다.

경고

데이터 정렬로 구성된 인덱스는 ICU 데이터 정렬 키를 사용하여 정렬 순서를 지정하므로, 데이터 정렬이 없는 인덱스의 경우 데이터 정렬 인식 인덱스 키가 인덱스 키보다 클 수 있습니다.

예를 들어, 컬렉션 myColl에는 대조 로케일이 "fr" 인 문자열 필드 category에 대한 색인이 있습니다.

db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )

인덱스와 동일한 데이터 정렬을 지정하는 다음 쿼리 작업에서는 인덱스를 사용할 수 있습니다.

db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )

하지만 기본적으로 '단순' 바이너리 데이터 정렬기를 사용하는 다음 쿼리 작업에서는 인덱스를 사용할 수 없습니다.

db.myColl.find( { category: "cafe" } )

인덱스 접두사 키가 문자열, 배열 및 내장된 문서가 아닌 복합 인덱스의 경우, 다른 데이터 정렬을 지정하는 작업에서도 인덱스를 사용하여 인덱스 접두사 키에 대한 비교를 지원할 수 있습니다.

예를 들어, 컬렉션 myColl에는 숫자 필드 scoreprice와 문자열 필드 category에 복합 인덱스가 있습니다. 인덱스는 문자열 비교를 위해 데이터 정렬 로캘 "fr"를 사용하여 만들어집니다.

db.myColl.createIndex(
{ score: 1, price: 1, category: 1 },
{ collation: { locale: "fr" } } )

문자열 비교에 "simple" 이진 데이터 정렬을 사용하는 다음 작업에서는 인덱스를 사용할 수 있습니다.

db.myColl.find( { score: 5 } ).sort( { price: 1 } )
db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )

색인이 생성된 category 필드의 문자열 비교를 위해 "simple" 이진 데이터 정렬을 사용하는 다음 작업은 색인을 사용하여 쿼리의 score: 5 부분만 수행할 수 있습니다.

db.myColl.find( { score: 5, category: "cafe" } )

중요

내장된 문서 키를 비롯한 문서 키와의 일치는 단순 이진 비교를 사용합니다. 즉, "foo.bár"와 같은 키에 대한 쿼리는 "foo.bar" 키와 일치하지 않습니다. 이는 강도 매개변수에 설정한 값에 관계없이 적용됩니다.

돌아가기

패턴 적용