복붙노트

[MONGODB] MongoDB의 레코드 톤 이상 느린 매김

MONGODB

MongoDB의 레코드 톤 이상 느린 매김

나는 몽고의 한 컬렉션을 통해 300K 기록을 가지고있다.

나는이 매우 간단한 쿼리를 실행하면 :

db.myCollection.find().limit(5);

그것은 단지 몇 밀리 초 걸립니다.

내가 사용하지만 쿼리에 건너 뛸 수 :

db.myCollection.find().skip(200000).limit(5)

그것은 분 반환 아무것도 실행 ... 아무것도 반환하지 않습니다.

어떻게 더 잘 만들려면?

해결법

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

    1.MongoDB의 문서에서 :

    MongoDB의 문서에서 :

    당신이 4만번째 페이지를 필요합니까 얼마나 자주 : 당신은 자신에게 질문을해야한다? 또한이 문서를 참조하십시오;

  2. ==============================

    2.이 문서의 많은 양이 있고 정렬 된 순서로 표시하는 경우이 문제에 대한 한 가지 방법은, 선택 당신이에 정렬하고 키를 사용하는 것입니다 (나는 확실하지 않다 당신이하지 않으면 얼마나 유용 스킵입니다) 결과의 다음 페이지를 참조하십시오.

    이 문서의 많은 양이 있고 정렬 된 순서로 표시하는 경우이 문제에 대한 한 가지 방법은, 선택 당신이에 정렬하고 키를 사용하는 것입니다 (나는 확실하지 않다 당신이하지 않으면 얼마나 유용 스킵입니다) 결과의 다음 페이지를 참조하십시오.

    당신이 시작한다면

    db.myCollection.find().limit(100).sort({created_date:true});
    

    다음 변수 max_created_date_from_last_result에 커서에 의해 반환 된 마지막 문서의 생성 날짜를 추출, 당신은 쿼리 (당신이 CREATED_DATE에 인덱스를 가지고 추정)이 훨씬 더 효율적으로 다음 페이지를 얻을 수 있습니다

    db.myCollection.find({created_date : { $gt : max_created_date_from_last_result } }).limit(100).sort({created_date:true}); 
    
  3. ==============================

    3.나는 함께 (스킵 + 제한하고 발견 + 제한 둘 다) 두 개념을 결합 확대됨에 발견했다. 이 문서 (특히 큰 문서)를 많이있을 때 스킵 + 제한의 문제는 빈약 한 성과이다. 찾기 + 제한의 문제는 당신이 임의의 페이지로 이동할 수 없다. 나는 순차적으로 그 일을하지 않고 페이지를 매기 할 수 있어야합니다.

    나는 함께 (스킵 + 제한하고 발견 + 제한 둘 다) 두 개념을 결합 확대됨에 발견했다. 이 문서 (특히 큰 문서)를 많이있을 때 스킵 + 제한의 문제는 빈약 한 성과이다. 찾기 + 제한의 문제는 당신이 임의의 페이지로 이동할 수 없다. 나는 순차적으로 그 일을하지 않고 페이지를 매기 할 수 있어야합니다.

    내가 취할 단계는 다음과 같습니다

    내가 (자바 스크립트) (16 개) 레코드 페이지 5432를 얻으려면 그것은이는 대충 다음과 같다 :

    let page = 5432;
    let page_size = 16;
    let skip_size = page * page_size;
    
    let retval = await db.collection(...).find().sort({ "_id": 1 }).project({ "_id": 1 }).skip(skip_size).limit(1).toArray();
    let start_id = retval[0].id;
    
    retval = await db.collection(...).find({ "_id": { "$gte": new mongo.ObjectID(start_id) } }).sort({ "_id": 1 }).project(...).limit(page_size).toArray();
    

    이 작품 투영 된 인덱스에 건너가 (내가 뭘하는지 인) 당신이 기록의 수백만을 건너 뛰는 경우에도 매우 빠른이기 때문이다. 당신이 ( "executionStats")를 설명 실행하는 경우, 그것은 여전히 ​​totalDocsExamined의 큰 숫자를 가지고 있지만 때문에 인덱스의 돌출부, 그것은 빠르고 매우입니다 (기본적으로, 데이터의 모양은 조사되지 않습니다). 그런 다음 손에 페이지의 시작을위한 값으로, 당신은 매우 신속하게 다음 페이지를 가져올 수 있습니다.

  4. from https://stackoverflow.com/questions/7228169/slow-pagination-over-tons-of-records-in-mongodb by cc-by-sa and MIT license