2012-02-01 2 views
2

필드 a와 b를 필터링하고 c를 순서화하는 쿼리가있는 경우 a, b 및 c에 대해 별도의 인덱스를 작성해야합니까, 아니면 실제로 (a, b, c)의 복합 인덱스를 작성해야합니까?)? 또한 쿼리의 시퀀스가 ​​인덱스의 시퀀스와 일치해야합니까? 즉, 쿼리의 필터 시퀀스가 ​​필터 b이고, 필터 c이고,이어서 a의 순서라면, (b, c, a)의 복합 인덱스를 갖는 것이 더 좋을까요?MongoDB에서 인덱스를 만들 때 선택해야하는 필드는 무엇입니까?

답변

2

현재 MongoDB는 쿼리 당 하나의 인덱스 만 사용하므로 복합 인덱스가 필요합니다.

인덱스 매개 변수의 순서는 문제는 아니지만 질문에 언급 된 방식과 관계 없습니다.

인덱스가 (c, b, a)이면 필터링에 유용하지 않으므로 특히 컬렉션에 많은 항목이있는 경우 필터링이 유용하지 않습니다. 정렬에 사용되는 필드는 인덱스의 마지막에 지정해야합니다.

따라서 색인은 (a, b, c) 또는 (b, a, c) 중 하나 여야합니다. 그 중 어느 쪽이 좋을까요 선택도에 달려 있습니다. 즉, 어느 필드가 더 빨리 일치하지 않는 항목을 제거 할 것입니까?

b에 대해 10,000 개의 가능한 값이 있고 a에 대해 가능한 값이 두 개인 경우 인덱스는 (b, a, c) 여야합니다. 반대로, a에 대해 더 많은 가능한 값이있는 경우, 아마도 (a, b, c)이어야합니다. 두 필드가 질의에서 문서를 제거하는 능력이 거의 같으면 그다지 중요하지 않습니다.

1

이 모든 내용은 docs에 응답됩니다. 복합 색인에 대한 절을 참조하십시오.

쿼리 매개 변수의 순서는 중요하지 않습니다.

+0

특히 일부는 필터링에 사용되는 경우와 일부는 주문할 때 인덱스의 필드 순서가 중요합니다. –

+0

인덱스 필드의 순서는 대답에서 설명하는대로 중요하지만 쿼리 매개 변수의 순서는 중요하지 않습니다. 색인 {a : 1, b : 1}이 주어지면 {b : "hi", a : 23}는 해당 색인을 사용합니다. –

+0

지역 필드가있는 경우 (C 가정) 쿼리가 다음과 같이 표시되는 경우 - find (c 인근 point1, a> 5) .sort (b)? (c : 2d, a : 1, b : 1)의 복합 색인이 작동하고 색인의 c, a, b 순서가 조회에 적합한 최상의 순서가됩니까? – tom

관련 문제