今天在mongodb索引帮助文档里发现下边的描述:
集合order有以下索引:
{ qty: 1 }
{ status: 1, ord_date: -1 }
{ status: 1 }
{ ord_date: -1 }
查询语句:
db.orders.find( { qty: { $gt: 10 } } ).sort( { status: 1 } )
That is, MongoDB does not use the { qty: 1 } index for the query, and the separate { status: 1 } or the { status: 1, ord_date: -1 } index for the sort.
sort不能使用{ status: 1 } 或 { status: 1, ord_date: -1 } 我能理解,但是为什么find不能使用{ qty: 1 } 这个索引呢?
补充:是我理解错了,查询最后使用了{qty:1}这个索引
PHPz2017-05-02 09:22:21
먼저 질문 하나 드리겠습니다. 이 쿼리에 어떤 인덱스가 사용되었는지 확인해 보셨나요?
그 문단을 영어로 다시 말씀해 주세요. 의미를 잘못 이해하신 것 같습니다. 이 문장은 쿼리 엔진이 {qty:1}
의 find
을 만족시키기 위해 을 사용하지 않고 동시에 가 {status: 1}
또는 {status: 1, ord_date: -1}
를 사용하여 sort
를 만족한다는 의미입니다. 좀 더 명확하게 설명하자면, 쿼리는 {qty: 1}
을 만족시키기 위해 find
를 사용하거나(그런 다음 메모리 정렬을 사용함) 정렬을 만족시키기 위해 {status: 1}
또는 {status: 1, ord_date: -1}
을 사용합니다(그러나 세트 스캔을 통해서만 결과 세트를 찾을 수 있습니다). ).
기존 인덱스에는 쿼리와 정렬을 모두 만족할 수 있는 인덱스가 없습니다. {status: 1, qty: 1}
입니다. 하지만 문제는 이것이 반드시 좋은 선택은 아니라는 점이다. 어쩌면 {qty: 1}
+메모리 정렬이 더 효율적일 수도 있습니다. 그것은 모두 데이터 분포에 따라 다릅니다. 구체적인 원리는 실제로 RDBMS의 인덱스와 동일하거나, B/B+ 트리를 이용한 인덱스에도 이런 장점이 있다. 몇 마디로 명확하게 설명하기 어렵다면 관련 정보를 찾아보자.
간단한 방법은 방금 언급한 모든 인덱스를 구축한 다음 이 쿼리를 실행하고 스스로 정리하도록 하는 것입니다. 결국 쿼리 엔진은 샘플링된 데이터를 기반으로 가장 적합한 인덱스를 선택합니다.
그럼 원래 질문으로 돌아가서 어떤 인덱스를 선택할지 시도해 보셨나요? 결국 어떤 지수가 승리할지는 데이터의 분포에 따라 결정되기 때문에 여기에는 명확한 답이 없습니다. 나는 {status: 1, qty: 1}
승리할 의향이 있습니다.