2011-03-09 3 views
18

이 질문은 색인을 관리하고 Bson Documents를 검색하는 내부 방법에 관한 것입니다.MongoDB : 인덱스 순서와 쿼리 순서가 일치해야합니까?

"index1", "index2", "index3"과 같은 다중 색인을 만들 때 ... 색인은 쿼리 중에 사용되도록 저장되지만 쿼리 순서와 결과는 어떻게됩니까?

샘플
로부터 index1, index2, INDEX3 ----> 동일한 순서 index1의 쿼리, index2, INDEX3 (최상의 경우) 다른 순서 index2에 로부터 index1, index2, INDEX3 ----> 쿼리로부터 index1 index3 (변경된 순서)

여러 번이 3 개의 인덱스와 다른 항목 또는 더 많은 인덱스를 포함하는 중첩 쿼리를 사용합니다. 질의의 순서는 시간을 잃어 버릴 수도 있습니다. 정의 된 인덱스 순서를 준수하는 쿼리를 전달해야하거나 내부 아키텍처가이 주문 검색을 처리해야합니까? 나는 내가 이것에 관심을 가지거나 자유의 manier에서 내 질문을 할 수 있는지 알고 싶다.

감사합니다. http://www.mongodb.org/display/DOCS/Indexes에서

+0

나는'mongodb-csharp' 태그를 제거하겠다. 이것은 백엔드의 색인에 관한 질문이다. –

답변

32

쿼리의 조건 순서는 인덱스를 사용할 수 있는지 여부에 영향을 미치지 않습니다.

일반적인 문서 구조 : 당신이 화합물 A 인덱스와 B가있는 경우

{ 
    "FieldA" : "A", 
    "FieldB" : "B" 
} 

가 :

db.MyCollection.find({FieldA : "A", FieldB : "B"}) 
db.MyCollection.find({FieldB : "B", FieldA : "A"}) 
: 다음

db.MyCollection.ensureIndex({FieldA : 1, FieldB : 1}) 

을 다음 쿼리 모두 해당 인덱스를 사용할 수 있습니다

그래서 쿼리의 조건을 정렬해도 인덱스가 사용되는 것을 막을 수는 없습니다. 제가 생각하기에 당신이 묻는 질문입니다.

셸에서 2 개의 쿼리를 시도하고 찾은 후 .explain()을 추가하여 쉽게 테스트 할 수 있습니다. 나는 이것을 확인하기 만했고 둘 다 복합 지수가 사용되었다는 것을 보여 주었다.다음 쿼리를 실행하면

그러나, FieldA가에 조회되는하지 않는 한이 인덱스를 사용하지 않습니다 :

db.MyCollection.find({FieldB : "B"}) 

그래서이 될 수 있는지 여부를 정의하는 인덱스에있는 필드의 순서이다 쿼리 자체에서 필드의 순서가 아니라 쿼리에 사용되었습니다 (Lucas가 언급 한 것입니다).

+2

여기서 중요한 점은 쿼리의 순서는 중요하지 않지만 인덱스에 정의 된 필드의 순서는 중요하다는 것입니다. –

+1

그러나 인덱스를 정의 할 때 순서를 어떻게 지정합니까? ensureIndex는 JS 객체를 param으로 가져오고 필드 JS 객체는 정렬되지 않습니다. (하이 스콧!) – Leopd

+4

@Leopd : 사양별로 주문하지는 않지만, 구현시 주문을 받게되며, MongoDB는이 동작에 의존합니다. 그것은 MongoDB에서 더 불쾌한 디자인 사마귀 중 하나이며, 대부분의 사전 유형이 * 주문되지 않기 때문에 다른 언어의 후프 점프로 연결됩니다. –

9

:

당신이 여러 필드에 복합 인덱스가있는 경우 필드의 시작 부분 집합에 쿼리에 사용할 수 있습니다. 당신이

C

A, B에 인덱스를, 그래서 만약 당신이 그것을

c를,

A, B, B,

A의 쿼리 사용할 수 있습니다

그렇습니다. 주문하십시오. 보다 정확한 대답이 필요한 경우 질문을 분명히해야합니다.

+0

b, a 또는 b, c, a 또는 c, b, a는 어떻게됩니까? 당신은 당신이 쿼리 할 수 ​​있다는 말을 들었 습니다만, 나는 인덱서에 제시 될 질서의 순서에 대해 독점적으로 요구합니다. var quer = Query.AND (Query.EQ ("B", b), Query.EQ ("A", a)), query = Query.Or (query, Query.EQ ("C", c)). 내부는 undestand A, B, C 또는 B, A, C를 잃을 것입니다. – user325558

+0

이 주석에 의해 인덱스 (A, B, C)로 가정하면 쿼리 최적화 프로그램이 (B, C, A)의 예제 쿼리를 (A, B, C)로 다시 정렬 할 수 있는지 묻는 것으로 가정합니다. 색인을 사용하려면 대답은 '예'이며, 이는 '설명'(@AdaTheDev가 지적한대로)을 사용하여 쉽게 확인할 수 있습니다. 참고 : 적어도 이것은 1.8.0rc1에 해당됩니다. 이전 버전에서는 테스트하지 않았습니다. –

+0

그렇다면 b와 c에서만 쿼리하면 색인이 사용되지 않을 것입니다. – MonkeyBonkey

관련 문제