programing

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

newnotes 2023. 4. 5. 22:13
반응형

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

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

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

매개 변수를 지정하지 않고 find()를 실행하면 데이터베이스는 자연스러운 순서의 개체를 반환합니다.

표준 테이블의 경우 자연 순서는 삽입 순서에 가까운 경우가 많지만 삽입 순서가 보장되지 않기 때문에 특별히 유용하지는 않습니다.그러나 Caped 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()또는 관련 사용 제한이 있는 고정 크기 상한 컬렉션의 특별한 경우.일반적인 워크로드의 경우 스토리지 엔진이 미리 할당된 사용 가능한 공간을 재사용하고 Disk와 메모리에 데이터를 가장 효율적으로 저장하는 방법을 결정하는 것이 좋습니다.

쿼리 기준이 없으면 스토리지 엔진에 의해 자연 순서(일명 검색된 순서대로)로 결과가 반환됩니다.결과 순서는 삽입 순서와 일치할 수 있지만 이 동작은 보장되지 않으며 (제한된 컬렉션을 제외하고) 신뢰할 수 없습니다.

스토리지(자연) 주문에 영향을 줄 수 있는 몇 가지 예:

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

인덱스를 사용하면 어떻게 됩니까?

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

예측 가능한 정렬 순서를 지정하려면 명시적 정렬 순서를 포함해야 합니다.sort()를 사용하여 정렬 키에 고유한 값을 지정합니다.

상한 컬렉션은 삽입 순서를 어떻게 유지합니까?

상한 컬렉션의 자연스러운 순서에 대해 기술된 구현 예외는 문서는 삽입 순서대로 저장되지만 기존 문서 크기를 늘릴 수 없으며 문서를 명시적으로 삭제할 수 없다는 특별한 사용 제한에 의해 적용됩니다.주문은 가장 오래된 문서를 먼저 "오래된" 상태로 만드는 제한 컬렉션 설계의 일부입니다.

저장된 순서(파일 내 순서)로 반환되지만 삽입된 순서라고는 할 수 없습니다._id 필드별로 정렬되지 않습니다.삽입 순서에 따라 정렬된 것처럼 보일 수 있지만 다른 요청으로 변경될 수 있습니다.그것은 믿을 수 없다.

언급URL : https://stackoverflow.com/questions/11599069/how-does-mongodb-sort-records-when-no-sort-order-is-specified

반응형