[MONGODB] MongoDB의 레코드 톤 이상 느린 매김
MONGODBMongoDB의 레코드 톤 이상 느린 매김
나는 몽고의 한 컬렉션을 통해 300K 기록을 가지고있다.
나는이 매우 간단한 쿼리를 실행하면 :
db.myCollection.find().limit(5);
그것은 단지 몇 밀리 초 걸립니다.
내가 사용하지만 쿼리에 건너 뛸 수 :
db.myCollection.find().skip(200000).limit(5)
그것은 분 반환 아무것도 실행 ... 아무것도 반환하지 않습니다.
어떻게 더 잘 만들려면?
해결법
-
==============================
1.MongoDB의 문서에서 :
MongoDB의 문서에서 :
당신이 4만번째 페이지를 필요합니까 얼마나 자주 : 당신은 자신에게 질문을해야한다? 또한이 문서를 참조하십시오;
-
==============================
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.나는 함께 (스킵 + 제한하고 발견 + 제한 둘 다) 두 개념을 결합 확대됨에 발견했다. 이 문서 (특히 큰 문서)를 많이있을 때 스킵 + 제한의 문제는 빈약 한 성과이다. 찾기 + 제한의 문제는 당신이 임의의 페이지로 이동할 수 없다. 나는 순차적으로 그 일을하지 않고 페이지를 매기 할 수 있어야합니다.
나는 함께 (스킵 + 제한하고 발견 + 제한 둘 다) 두 개념을 결합 확대됨에 발견했다. 이 문서 (특히 큰 문서)를 많이있을 때 스킵 + 제한의 문제는 빈약 한 성과이다. 찾기 + 제한의 문제는 당신이 임의의 페이지로 이동할 수 없다. 나는 순차적으로 그 일을하지 않고 페이지를 매기 할 수 있어야합니다.
내가 취할 단계는 다음과 같습니다
내가 (자바 스크립트) (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의 큰 숫자를 가지고 있지만 때문에 인덱스의 돌출부, 그것은 빠르고 매우입니다 (기본적으로, 데이터의 모양은 조사되지 않습니다). 그런 다음 손에 페이지의 시작을위한 값으로, 당신은 매우 신속하게 다음 페이지를 가져올 수 있습니다.
from https://stackoverflow.com/questions/7228169/slow-pagination-over-tons-of-records-in-mongodb by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB의 배열에 배열 쿼리 (0) | 2019.12.05 |
---|---|
[MONGODB] 방법) (MongoDB의 네이티브 findOne의 필드 이름으로 변수를 사용하는 방법? (0) | 2019.12.05 |
[MONGODB] MongoDB를 거부 연결 (111) errno를 (0) | 2019.12.05 |
[MONGODB] 몽구스 찾기 / 업데이트 하위 문서 (0) | 2019.12.05 |
[MONGODB] 자동 MongoDB의에서 삭제 된 공간을 압축? (0) | 2019.12.05 |