programing

MongoDB에서 인덱스 방향이 중요한 이유는 무엇입니까?

nasanasas 2020. 8. 13. 23:27
반응형

MongoDB에서 인덱스 방향이 중요한 이유는 무엇입니까?


문서 를 인용하려면 :

인덱스를 만들 때 키와 관련된 숫자는 인덱스의 방향을 지정하므로 항상 1 (오름차순) 또는 -1 (내림차순)이어야합니다. 방향은 단일 키 인덱스 또는 임의 액세스 검색에 중요하지 않지만 복합 인덱스에 대해 정렬 또는 범위 쿼리를 수행하는 경우 중요합니다.

그러나 나는 지수의 방향이 복합 지수에서 중요한 이유를 알지 못한다. 누군가가 추가 설명 (또는 예)을 제공 할 수 있습니까?


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}


왜 인덱스

두 가지 핵심 사항을 이해하십시오.

  1. 인덱스가없는 것보다 낫지 만 올바른 인덱스가 어느 쪽보다 훨씬 낫습니다.
  2. MongoDB는 쿼리 당 하나의 인덱스 만 사용하므로 사용하려는 올바른 필드 순서로 복합 인덱스를 만듭니다.

인덱스는 무료가 아닙니다. 메모리를 차지하고 삽입, 업데이트 및 삭제를 수행 할 때 성능 저하를 부과합니다. 일반적으로 성능 저하는 무시할 수 있지만 (특히 읽기 성능 향상에 비해) 그렇다고 인덱스 생성에 대해 현명 할 수 없다는 의미는 아닙니다.

인덱스 방법

함께 인덱싱해야하는 필드 그룹을 식별하는 것은 실행중인 쿼리를 이해하는 것입니다. 색인을 만드는 데 사용되는 필드의 순서는 중요합니다. 좋은 소식은 주문을 잘못하면 인덱스가 전혀 사용되지 않으므로 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 }

참고 URL : https://stackoverflow.com/questions/10329104/why-does-direction-of-index-matter-in-mongodb

반응형