인덱스 교차
이 페이지의 내용
중요
이 페이지에서는 쿼리 옵티마이 저가 인덱스 교차를 사용할 수 있는 경우를 설명합니다.
실제로 쿼리 옵티마이저 는 인덱스 교차를 사용하는 계획을 거의 선택하지 않습니다.
해시 기반 인덱스 교차는 기본적으로 비활성화되어 있으며, 계획 선택 시 정렬 기반 인덱스 교차가 선호되지 않습니다. 옵티마이저는 잘못된 계획 선택을 방지하기 위해 이러한 방식으로 작동합니다.
스키마 설계는 인덱스 교차에 의존해서는 안 됩니다. 대신 복합 인덱스 를 사용해야 합니다.
쿼리 옵티마이저의 향후 개선 사항을 통해 시스템에서 인덱스 교차 계획이 유용한 경우를 더 잘 식별할 수 있습니다.
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" } )
인덱스 교차 및 복합 인덱스
인덱스 교차가 복합 인덱스 를 생성할 필요성을 없애지는 못합니다. 그러나 목록 순서(즉, 키가 인덱스에 나열되는 순서)와 정렬 순서(즉, 오름차순 또는 내림차순) 복합 인덱스의 문제 복합 인덱스 는 인덱스 접두사 키 를 포함하지 않거나 다른 정렬 순서를 지정하는 쿼리 조건을 지원하지 않을 수 있습니다.
예를 들어, 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 } )