복붙노트

[MONGODB] 어떻게하여 MongoDB에서 인덱스 작업으로 분류 하는가?

MONGODB

어떻게하여 MongoDB에서 인덱스 작업으로 분류 하는가?

인덱스가 실제로 MongoDB를 작동으로 정렬하는 방법 궁금하네요. 거기 MongoDB의 문서에서 두 기사가 있지만, 그들은 실제로 정렬 진행하거나 시간 복잡도 방법을 설명하지 않습니다. SO와 일반적으로 interweb의 검색은 지금까지 아무것도 관련을 설정하지 않았습니다.

의 반환 C 문서의 제한이있어, 모음의 문서, 문서 나 찾기 () 절 일치가 있다고 가정합시다 >> B >> C 및 C 일부 적절하게 많은 수의 등의 반환 세트에 맞지 않을 수있다 메모리 -하자 예를 들어, 1M 문서를 말한다.

작업의 시작에서, 요구 정렬 할 것을 B 문서 및 문서에 의해 정렬됩니다 기능에 대한 크기 (a)의 정렬 된 트리 인덱스가 존재한다.

내가 상상할 수있는:

A)는 순서대로 인덱스를 순회하고, 각 B objectID에 대한 문서의 목록을 통과. C에 도달 할 때까지 반환 일치합니다. 이 될 것이다 O (AB).

A와 B)), B하지만 먼저 문서 내의하며 Object의 HashSet의 구축. 이것은 (a) O이지만, O (b) 메모리 걸린다.

나는 B 문서의 집합을 통과에 따라 종류를 고려하려고 노력했지만, 더 좋은 인덱스없이 정렬보다 O (B 로그 B),보다 빠르게 아무것도 올 수없는 것.

그래서 어떻게 정렬 실제로 작업을하지, 난 가정 (그러나 나는 틀렸다 어쩌면) 모든 종류의 인덱스 스캔을 필요로하지 않습니다?

최신 정보:

케빈의 대답과 제공된 링크가 많은 질문을 좁힐,하지만 난 확인하고 싶습니다 / 몇 점을 명확히 :

... 그 순서대로에와 b 복합 인덱스가있다. 어떻게 경우 정렬 작업 종류 A 또는 B에있는 것? $ 또는 내가 그것을 이해보다, 이후 복잡는, $ 또는 쿼리는 기본적으로 여러 개의 별도의 쿼리로 분할된다. 적어도 별도의 쿼리의 결과를 병합, 항상 $ 또는 쿼리를 인 - 메모리 종류입니까?

해결법

  1. ==============================

    1.MongoDB의에서 인덱스는 B 트리 구조에 저장되는 위치에 디스크의 특정 위치에 각 인덱스 항목을 가리 킵니다. MongoDB의 지수는 항상에서 주문 통과, 정렬 된 순서로 저장하고, MongoDB를 인덱스를 통해 정렬 된 순서로 일련의 문서를 가져 오기위한 저렴하다는 것을 의미 또한 B-트리 구조를 사용.

    MongoDB의에서 인덱스는 B 트리 구조에 저장되는 위치에 디스크의 특정 위치에 각 인덱스 항목을 가리 킵니다. MongoDB의 지수는 항상에서 주문 통과, 정렬 된 순서로 저장하고, MongoDB를 인덱스를 통해 정렬 된 순서로 일련의 문서를 가져 오기위한 저렴하다는 것을 의미 또한 B-트리 구조를 사용.

    업데이트 : B - 트리 구조가 MMAPv1 스토리지 엔진에 대한 사실이지만, (MongoDB를 3.2부터 기본값) WiredTiger 스토리지 엔진에 의해 약간 다르게 구현됩니다. 그것은 정렬 된 순서로 인덱스를 통과하는 저렴한 어디 기본적인 아이디어는 동일합니다.

    쿼리에 정렬 스테이지 (즉, 메모리 정렬)은 메모리 사용가 32MB로 한정되어있다. 정렬 단계는이 제한을 초과하는 경우 쿼리가 실패합니다. 이 제한은 MongoDB를이 메모리 종류를 수행하지 않고 일종의 () 매개 변수를 사용하여 쿼리를 반환 할 수 있습니다 그래서, 인덱스의 정렬 특성을 이용하여 한 발짝 비켜 할 수 있습니다.

    우리가 쿼리가 모양이라고 가정 해 봅시다 :

        db.a.find({b:{$gt:100}, c:{$gt:200}}).sort(...)
    

    회수와는 인덱스를 갖는

        db.a.createIndex({b:1,c:1})
    

    정렬 () 단계는 쿼리에 지정된 두 가지 시나리오가 있습니다 :

    1. MongoDB를 인덱스의 정렬 된 특성을 사용할 수 없습니다와 메모리 SORT 단계를 수행해야합니다.

    이 쿼리는 "인덱스 접두사"를 사용할 수없는 경우 결과입니다. 예를 들면 :

        db.a.find({b:{$gt:100}, c:{$gt:200}}).sort({c:1})
    

    상기 쿼리에 인덱스 {B : 1, C : 1}하는데 사용될 수있다 :

    따라서, MongoDB를은 선택의 여지가 있지만, 메모리 정렬을 수행 할 수 있습니다. 이 쿼리의 설명 () 출력은 SORT 단계를해야합니다. 이 정렬 단계는 메모리 사용 32MB의 제한됩니다.

    2. MongoDB를 인덱스의 정렬 된 특성을 사용할 수 있습니다.

    쿼리를 사용하는 경우이 결과입니다 :

    예를 들면 :

        db.a.find({b:{$gt:100}, c:{$gt:200}}).sort({b:1})
    

    상기 쿼리에 인덱스 {B : 1, C : 1}하는데 사용될 수있다 :

    위의 쿼리의 설명 () 출력은 SORT 단계가되지 않습니다. 또한,는와 동일하다 ()없이 정렬 쿼리 ()의 출력을 설명한다. 본질적으로, 우리는 무료로 정렬 ()를 받고있다.

    이 주제를 이해하는 가치있는 자원 최적화 MongoDB의 복합 인덱스입니다. 용어의 일부는, 게시물의 전문적 여전히 관련이 오래된 될 수 있지만이 블로그 게시물은 2012 년 방식으로 다시 작성되었습니다 있습니다.

    후속 질문에 대한 업데이트

    다른 유형의 분류에 대한 업데이트

    필드는 문서 간의 서로 다른 유형이있는 경우 (A는 문자열이 또 다른 부울, 하나 개의 문서, 다른 사람의 숫자에있는 경우, 예를 들어), 어떻게 정렬 진행합니까?

    대답은 MongoDB를 BSON 유형 비교 순서입니다. 매뉴얼 페이지를 의역하기 위해, 순서는 다음과 같습니다

    따라서 오름차순를 사용하여 위의 예에서 숫자를 포함하는 문서는 문자열 부울 후, 먼저 나타난다.

  2. from https://stackoverflow.com/questions/36142299/how-does-sorting-with-an-index-work-in-mongodb by cc-by-sa and MIT license