몽고DB에서 지수 방향이 중요한 이유는 무엇인가?
문서를 인용하려면:
인덱스를 작성할 때는 키와 관련된 숫자가 인덱스의 방향을 지정하므로 항상 1(상승) 또는 -1(내림)이어야 합니다.방향은 단일 키 색인이나 임의 액세스 검색에는 중요하지 않지만 복합 색인에 대해 정렬 또는 범위 쿼리를 수행하는 경우 중요합니다.
그러나 복합지수에 지수의 방향성이 중요할 이유는 없다고 본다.누군가 더 자세한 설명(또는 예)을 해주실 수 있나요?
MongoDB는 어떤 방식으로든 복합 키를 연결하여 BTree의 키로 사용합니다.
단일 항목을 찾을 때 - 트리의 노드 순서는 관련이 없습니다.
노드 범위를 반환하는 경우 - 서로 가까운 요소가 트리의 동일한 분기 아래에 있습니다.노드가 범위에 가까울수록 더 빨리 검색할 수 있습니다.
단일 필드 색인 사용 - 순서는 중요하지 않습니다.오름차순으로 서로 가까울 경우 내림차순으로 서로 가까울 것입니다.
복합 키가 있는 경우 - 순서가 중요해집니다.
예를 들어 키가 A 오름차순 B인 경우 인덱스는 다음과 같습니다.
A행 B1 1 12 2 63 2 74 3 45 3 56 3 67 5 1
A 오름차순 B 내림차순 쿼리는 행을 반환하기 위해 인덱스를 건너뛰어야 하며 속도가 느려집니다.를 들어 행이 됩니다.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}
인덱스를 사용하는 이유
두 가지 핵심 사항을 이해하십시오.
- 지수가 없는 것보다는 낫지만, 정확한 지수는 어느 쪽보다 훨씬 낫다.
- MongoDB는 쿼리당 하나의 인덱스만 사용하여 적절한 필드의 복합 인덱스를 만듭니다.
인덱스는 무료가 아닙니다.메모리를 사용하여 삽입, 업데이트 및 삭제를 수행할 때 성능 저하가 발생합니다.일반적으로 성능 저하(특히 읽기 성능 향상에 비해)는 무시할 수 있지만, 그렇다고 해서 인덱스를 현명하게 작성할 수 없는 것은 아닙니다.
인덱스 방법
함께 인덱싱해야 하는 필드 그룹을 식별하는 것은 실행 중인 쿼리를 이해하는 것입니다.인덱스를 만드는 데 사용되는 필드의 순서가 중요합니다.좋은 소식은 순서를 틀리면 인덱스가 전혀 사용되지 않기 때문에 설명하면 쉽게 찾을 수 있다는 것입니다.
정렬 이유
쿼리에 정렬이 필요할 수 있습니다.그러나 정렬은 비용이 많이 들기 때문에 정렬하는 필드를 쿼리하는 필드와 동일하게 취급하는 것이 중요합니다.그래서 인덱스가 있으면 더 빠를 거예요.그러나 한 가지 중요한 차이가 있습니다. 정렬할 필드는 인덱스의 마지막 필드여야 합니다.이 규칙의 유일한 예외는 필드가 쿼리의 일부이기도 한 경우 must-be-last-rule이 적용되지 않는다는 것입니다.
정렬 방법
인덱스의 모든 키 또는 하위 집합에서 정렬을 지정할 수 있지만 정렬 키는 인덱스에 표시되는 것과 동일한 순서로 나열되어야 합니다.예를 들어 인덱스 키 패턴 { 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
'bestsource' 카테고리의 다른 글
Angular: & 를 사용하여 다이렉트 링크 함수 내에서 컨트롤러 함수를 호출합니다. (0) | 2023.03.10 |
---|---|
Wordpress Core를 자체 스크립트에 포함 (0) | 2023.03.10 |
FROM의 하위 쿼리에 별칭이 있어야 합니다. (0) | 2023.03.10 |
에이잭스를 사용하여 양식을 제출하다 (0) | 2023.03.10 |
Python에서 JSON을 아름답게 하는 방법 (0) | 2023.03.05 |