답변:
MongoDB는 어떤 방식 으로든 복합 키를 연결하고이를 BTree의 키로 사용합니다.
단일 항목을 찾을 때 -트리의 노드 순서는 관련이 없습니다.
노드 범위를 반환하는 경우 -서로 가까운 요소는 트리의 동일한 분기 아래에 있습니다. 노드가 범위에 가까울수록 더 빨리 검색 할 수 있습니다.
단일 필드 인덱스 사용 -순서는 중요하지 않습니다. 오름차순으로 서로 가깝다면 내림차순으로도 가깝습니다.
복합 키가있을 때 -순서가 중요하기 시작합니다.
예를 들어 키가 A 오름차순 B 오름차순 인 경우 색인은 다음과 같습니다.
행 AB 1 1 1 2 2 6 3 2 7 4 34 5 3 5 6 3 6 7 5 1
A 오름차순 B 내림차순에 대한 쿼리는 행을 반환하기 위해 순서에 상관없이 인덱스를 건너 뛰어야하며 속도가 느려집니다. 예를 들어 Row를 반환합니다.1, 3, 2, 6, 5, 4, 7
인덱스와 동일한 순서의 범위 쿼리는 단순히 올바른 순서로 순차적으로 행을 반환합니다.
BTree에서 레코드를 찾는 데 O (Log (n)) 시간이 걸립니다. 순서대로 레코드 범위를 찾는 것은 OLog (n) + k입니다. 여기서 k는 반환 할 레코드 수입니다.
레코드가 잘못된 경우 비용은 OLog (n) * k만큼 높을 수 있습니다.
찾고 있는 간단한 대답 은 두 개 이상의 필드에서 정렬 할 때만 방향이 중요 하다는 것 입니다.
정렬하는 경우 {a : 1, b : -1}
:
지수는 {a : 1, b : 1}
것 보다 느리게 인덱스{a : 1, b : -1}
{a: -1, b: -1}
경우 {a: -1, b: -1}
색인이 있어야 하거나 {a: 1, b: 1}
충분할 것 입니다.
{a: 1, b: 1}
인덱스는 인덱스를 완전히 반전하는 것이 좋으므로 충분해야합니다. 예를 들어 인덱스에 {a: 1}
에 종류에 사용할 수 있습니다{a: -1}
두 가지 핵심 사항을 이해하십시오.
인덱스는 무료가 아닙니다. 메모리를 차지하고 삽입, 업데이트 및 삭제를 수행 할 때 성능 저하를 부과합니다. 일반적으로 성능 저하는 무시할 수 있지만 (특히 읽기 성능 향상에 비해) 그렇다고 인덱스 생성에 대해 현명 할 수 없다는 의미는 아닙니다.
함께 인덱싱해야하는 필드 그룹을 식별하는 것은 실행중인 쿼리를 이해하는 것입니다. 색인을 만드는 데 사용되는 필드의 순서는 매우 중요합니다. 좋은 소식은 주문이 잘못되면 인덱스가 전혀 사용되지 않으므로 Explain으로 쉽게 찾을 수 있다는 것입니다.
쿼리에 정렬이 필요할 수 있습니다. 그러나 정렬은 비용이 많이 드는 작업이 될 수 있으므로 정렬하는 필드를 쿼리하는 필드처럼 처리하는 것이 중요합니다. 따라서 인덱스가 있으면 더 빠를 것입니다. 하지만 한 가지 중요한 차이점이 있습니다. 정렬하는 필드는 인덱스의 마지막 필드 여야합니다. 이 규칙에 대한 유일한 예외는 필드가 쿼리의 일부인 경우 마지막이어야하는 규칙이 적용되지 않는 것입니다.
인덱스의 모든 키 또는 하위 집합에 대해 정렬을 지정할 수 있습니다. 그러나 정렬 키는 색인에 나타나는 순서대로 나열되어야합니다. 예를 들어, 인덱스 키 패턴 {a : 1, b : 1}은 {a : 1, b : 1}에서 정렬을 지원할 수 있지만 {b : 1, a : 1}에서는 지원하지 않습니다.
정렬은 인덱스 키 패턴으로 모든 키에 대해 동일한 정렬 방향 (예 : 오름차순 / 내림차순)을 지정하거나 인덱스 키 패턴으로 모든 키에 대해 역 정렬 방향을 지정해야합니다. 예를 들어 인덱스 키 패턴 {a : 1, b : 1}은 {a : 1, b : 1} 및 {a : -1, b : -1}에 대한 정렬을 지원할 수 있지만 {a : -1에 대해서는 지원하지 않습니다. , b : 1}.
다음 색인이 있다고 가정합니다.
{ a: 1 }
{ a: 1, b: 1 }
{ a: 1, b: 1, c: 1 }
Example Index Used
db.data.find().sort( { a: 1 } ) { a: 1 }
db.data.find().sort( { a: -1 } ) { a: 1 }
db.data.find().sort( { a: 1, b: 1 } ) { a: 1, b: 1 }
db.data.find().sort( { a: -1, b: -1 } ) { a: 1, b: 1 }
db.data.find().sort( { a: 1, b: 1, c: 1 } ) { a: 1, b: 1, c: 1 }
db.data.find( { a: { $gt: 4 } } ).sort( { a: 1, b: 1 } ) { a: 1, b: 1 }
{ a: 1, b: 1, c: 1 }
어떻게 당신이 정말로 인덱스가 필요 { a: 1}
하고 { a: 1, b: 1}
또는 인덱스 { a: 1, b: 1, c: 1 }
커버 모든 경우를? 쿼리는 항상 같은 종류를 사용하지 않는 경우 : 쿼리에 하나 더 종류 -1
1, 3, 2, 6, 5, 4, 7
?