[mongodb] 정렬 순서가 지정되지 않은 경우 MongoDB는 레코드를 어떻게 정렬합니까?

정렬 순서를 지정하지 않고 Mongo find () 쿼리를 실행할 때 데이터베이스는 결과를 정렬하기 위해 내부적으로 무엇을 사용합니까?

mongo 웹 사이트문서에 따르면 :

매개 변수없이 find ()를 실행할 때 데이터베이스는 객체를 순방향 자연 순서로 반환합니다.

표준 테이블의 경우 자연 순서는 특히 유용하지 않습니다. 순서가 삽입 순서에 가까운 경우가 많지만 보장되지 않기 때문입니다. 그러나 Capped Collections의 경우 자연 순서가 게재 신청서로 보장됩니다. 이것은 매우 유용 할 수 있습니다.

그러나 표준 컬렉션 (제한되지 않은 컬렉션)의 경우 결과를 정렬하는 데 사용되는 필드는 무엇입니까? 그것은이다 _id의 필드 또는 뭔가 다른?

편집하다:

기본적으로 내가 얻으려는 것은 다음 검색 쿼리를 실행하는 것입니다.

db.collection.find({"x":y}).skip(10000).limit(1000);

서로 다른 두 시점 : t1t2 에서 다른 결과 집합을 얻습니다.

  1. t1과 t2 사이에 추가 쓰기가 없었을 때?
  2. t1과 t2 사이에 새로운 쓰기가 있었습니까?
  3. t1과 t2 사이에 추가 된 새 인덱스가 있습니까?

임시 데이터베이스에서 몇 가지 테스트를 실행했으며 얻은 결과 는 3 가지 경우 모두 동일합니다 ( ).하지만 확신하고 싶었고 내 테스트 사례가 그다지 철저하지 않다고 확신합니다.



답변

아무것도 지정되지 않은 경우 기본 정렬 순서는 무엇입니까?

기본 내부 정렬 순서 (또는 자연 순서 )는 정의되지 않은 구현 세부 사항입니다. 순서를 유지하는 것은 스토리지 엔진의 추가 오버 헤드이며 MongoDB의 API는 관련 사용 제한 이있는 sort()고정 크기 제한 컬렉션 의 명시 적 또는 특수한 경우를 제외하고 예측 가능성을 요구하지 않습니다 . 일반적인 워크로드의 경우 스토리지 엔진이 사용 가능한 사전 할당 된 공간을 재사용하고 디스크와 메모리에 데이터를 가장 효율적으로 저장하는 방법을 결정하는 것이 바람직합니다.

어떤 쿼리 조건없이, 결과의 스토리지 엔진에 의해 반환되는 자연 순서 (일명 순서대로 그들이 발견된다 ). 결과 순서는 게재 신청서와 일치 할 수 있지만이 동작은 보장되지 않으며 신뢰할 수 없습니다 (제한된 컬렉션 제외).

저장 (자연) 순서에 영향을 미칠 수있는 몇 가지 예 :

  • WiredTiger는 디스크의 문서와 메모리 내 캐시의 다른 표현을 사용하므로 내부 데이터 구조에 따라 자연스러운 순서가 변경 될 수 있습니다.
  • 원래 MMAPv1 스토리지 엔진 (MongoDB 4.2에서 제거됨)은 패딩 규칙에 따라 문서에 대한 레코드 공간을 할당합니다. 문서가 현재 할당 된 레코드 공간을 초과하면 문서 위치 (및 자연 순서)가 영향을받습니다. 삭제 또는 이동 된 문서로 인해 재사용 가능한 것으로 표시된 저장소에 새 문서를 삽입 할 수도 있습니다.
  • 복제는 멱등 oplog 형식을 사용하여 복제본 세트 구성원 전체에 일관되게 쓰기 작업을 적용합니다. 각 복제 세트 구성원은 자연스러운 순서가 다를 수있는 로컬 데이터 파일을 유지하지만 oplog 업데이트가 적용될 때 동일한 데이터 결과를 갖습니다.

인덱스가 사용되면 어떻게됩니까?

인덱스를 사용하는 경우 문서는 찾은 순서대로 반환됩니다 (삽입 순서 또는 I / O 순서와 반드시 일치해야 함). 둘 이상의 인덱스가 사용되는 경우 순서는 중복 제거 프로세스 중에 문서를 처음 식별 한 인덱스에 따라 내부적으로 달라집니다.

당신이 예측 가능한 정렬 순서를 원하는 경우에 당신은 있어야합니다 명시 적으로 포함 sort()하여 쿼리를하고 정렬 키에 대한 고유 값을 가지고있다.

제한된 컬렉션은 게재 신청서를 어떻게 유지하나요?

제한 컬렉션의 자연 순서에 대해 언급 된 구현 예외는 특수 사용 제한에 의해 적용됩니다. 문서는 삽입 순서로 저장되지만 기존 문서 크기는 늘릴 수 없으며 문서는 명시 적으로 삭제할 수 없습니다. 주문은 가장 오래된 문서가 먼저 “만료”되도록 보장하는 제한 컬렉션 디자인의 일부입니다.


답변

저장된 순서 (파일의 순서)로 반환되지만 삽입 된 순서라는 보장은 없습니다. _id 필드로 정렬되지 않습니다. 때로는 게재 신청서에 따라 정렬 된 것처럼 보일 수 있지만 다른 요청에서 변경 될 수 있습니다. 신뢰할 수 없습니다.


답변