문서 메뉴

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

인덱스 교차

이 페이지의 내용

  • 인덱스 접두사 교차
  • 인덱스 교차 및 복합 인덱스
  • 인덱스 교차 및 정렬
  • 인덱스 교차 및 Atlas Search 인덱스

중요

이 페이지에서는 쿼리 옵티마이저 가 인덱스 교차를 사용할 있는 경우를 문서합니다.

실제로 쿼리 옵티마이저 는 인덱스 교차를 사용하는 계획을 거의 선택하지 않습니다.

해시 기반 인덱스 교차는 기본적으로 비활성화되어 있으며, 계획 선택 시 정렬 기반 인덱스 교차가 선호되지 않습니다. 옵티마이저는 잘못된 계획 선택을 방지하기 위해 이러한 방식으로 작동합니다.

스키마 설계는 인덱스 교차에 의존해서는 안 됩니다. 대신 복합 인덱스 를 사용해야 합니다.

쿼리 옵티마이저의 향후 개선 사항을 통해 시스템에서 인덱스 교차 계획이 유용한 경우를 더 잘 식별할 수 있습니다.

MongoDB는 여러 인덱스의 교차점을 사용하여 쿼리를 처리할 수 있습니다. 일반적으로 각 인덱스 교차에는 두 개의 인덱스가 포함됩니다. 그러나 MongoDB는 다중/중첩 인덱스 교차를 사용하여 쿼리를 해결할 수 있습니다.

인덱스 교차를 설명하기 위해 다음 인덱스가 있는 orders 컬렉션을 가정해 보겠습니다.

{ qty: 1 }
{ item: 1 }

MongoDB는 두 인덱스의 교차점을 사용하여 다음 쿼리를 지원할 수 있습니다.

db.orders.find( { item: "abc123", qty: { $gt: 15 } } )

MongoDB가 인덱스 교차를 사용했는지 확인하려면 explain() 를 실행합니다. explain() 의 결과에는 AND_SORTED 단계 또는 AND_HASH 단계가 포함됩니다.

인덱스 교차를 통해 MongoDB는 전체 인덱스 또는 인덱스 접두사의 교차를 사용할 수 있습니다. 인덱스 접두사는 복합 인덱스의 하위 집합으로, 인덱스의 시작 부분부터 시작하여 하나 이상의 키로 구성됩니다.

다음 인덱스가 있는 collection orders 을 가정해 보겠습니다.

{ qty: 1 }
{ status: 1, ord_date: -1 }

qty 필드와 status 필드 모두에 조건을 지정하는 다음 쿼리를 수행하기 위해 MongoDB는 두 인덱스의 교집합을 사용할 수 있습니다.

db.orders.find( { qty: { $gt: 10 } , status: "A" } )

인덱스 교차가 복합 인덱스 를 생성할 필요성을 없애지는 못합니다. 그러나 목록 순서(즉, 키가 인덱스에 나열되는 순서)와 정렬 순서(즉, 오름차순 또는 내림차순) 복합 인덱스의 문제 복합 인덱스인덱스 접두사 키 를 포함하지 않거나 다른 정렬 순서를 지정하는 쿼리 조건을 지원하지 않을 수 있습니다.

참고

MongoDB Atlas에서 호스팅되는 배포의 경우 필드 순서로 인한 제한을 피하려면 Atlas Search 인덱스 를 사용하는 것이 좋습니다.

예를 들어, collection orders 에 다음과 같은 복합 인덱스가 있고 필드 status 가 필드 ord_date 앞에 나열된 경우입니다.

{ status: 1, ord_date: -1 }

복합 인덱스는 다음 쿼리를 지원할 수 있습니다.

db.orders.find( { status: { $in: ["A", "P" ] } } )
db.orders.find(
{
ord_date: { $gt: new Date("2014-02-01") },
status: {$in:[ "P", "A" ] }
}
)

그러나 다음 두 쿼리는 그렇지 않습니다.

db.orders.find( { ord_date: { $gt: new Date("2014-02-01") } } )
db.orders.find( { } ).sort( { ord_date: 1 } )

그러나 collection에 두 개의 개별 인덱스가 있는 경우:

{ status: 1 }
{ ord_date: -1 }

두 인덱스는 개별적으로 또는 인덱스 교차를 통해 앞서 언급한 네 가지 쿼리를 모두 지원할 수 있습니다.

쿼리를 지원하는 복합 인덱스를 생성할지, 아니면 인덱스 교차에 의존할지 여부는 시스템의 특성에 따라 달라집니다.

다음도 참조하세요.

sort() 작업에 쿼리 술어와 완전히 별도의 인덱스가 필요한 경우 인덱스 교차가 적용되지 않습니다.

예를 들어, orders collection에는 다음과 같은 인덱스가 있습니다.

{ qty: 1 }
{ status: 1, ord_date: -1 }
{ status: 1 }
{ ord_date: -1 }

MongoDB는 다음 쿼리에 인덱스 교차를 정렬과 함께 사용할 수 없습니다.

db.orders.find( { qty: { $gt: 10 } } ).sort( { status: 1 } )

즉, MongoDB는 쿼리에 { qty: 1 } 인덱스를 사용하고 정렬에 별도의 { status: 1 } 또는 { status: 1, ord_date: -1 } 인덱스를 사용하지 않습니다.

그러나 인덱스 { status: 1, ord_date: -1 } 이 쿼리 술어의 일부를 수행할 수 있으므로 MongoDB는 정렬과 함께 다음 쿼리에 대해 인덱스 교차를 사용할 수 있습니다.

db.orders.find( { qty: { $gt: 10 } , status: "A" } ).sort( { ord_date: -1 } )

MongoDB Atlas를 사용하는 경우, 쿼리 옵티마이저가 인덱스 교차가 포함된 계획을 선택할 때 쿼리를 수행하기 위해 Atlas Search 인덱스를 생성할 수 있습니다. 복합 인덱스 와 달리 Atlas Search 인덱스의 필드는 어떤 순서로든 정의할 수 있습니다. 결과적으로 Atlas Search 인덱스는 다음과 같은 쿼리를 지원할 수 있습니다.

인덱스 교차가 필요할 때 Atlas Search 인덱스를 사용하는 방법에 대한 튜토리얼은 Atlas Search를 사용한 유연한 쿼리를 참조하세요.

참고

Atlas Search 검색 인덱스는 MongoDB Atlas Atlas cluster에서만 사용할 수 있으며 자체 managed 배포서버에는 사용할 수 없습니다. 자세한 내용은 다음을 참조하세요.

← 분할된 클러스터에서 롤링 인덱스 빌드