2012-12-02 7 views
3

OS로 메모리 매핑 된 파일과 관련하여 MongoDB에서 캐싱이 어떻게 작동하는지 잘 알고 있습니다. 그러나, 나는 내가 한 컬렉션 문서의 형식을 가지고 MongoDB에서 부분적인 문서 캐싱

이의 말을하자 ... 그것의 세부 사항에 더 관심이 있어요 :

{ 
    _id: ObjectId("..."), 
    first_name: "x", 
    last_name: "y", 
    email: "z" 
} 
  1. findOne({_id: ObjectId("...")}) 명령이 실행 된 경우, 전체 문서가 캐시에 저장됩니다. 이후에 findOne({_id: ObjectId("...")}, {email: 1})을 실행하면 캐시가 사용됩니다 (이 마지막 명령에서 이메일 필드에만 관심이 있음).

  2. findOne({_id: ObjectId("...")}, {first_name: 1, last_name: 1})을 발행하면 전체 문서가 캐시에 저장되거나 투영 된 필드에 저장됩니까? 즉, 이전 명령 다음에 findOne({_id: ObjectId("...")})을 실행하면 캐시가 사용됩니까?

감사합니다, 당신의 쿼리가 (즉, covered index 사용) 만 인덱스에 의해 충족되지 않는 한
즐 라트 코

답변

2

, 그 문서의 일부를로드 조치 메모리에 페이지 전체를 것이다. 따라서 다시 실행하고 반환 된 필드를 변경하면 문서가 캐시에 저장됩니다.

투영법을 사용하여 특정 필드를 제한하는 것은 지정하지 않은 필드를 반환하지 않는다는 것을 의미합니다 (따라서 사용하지 않는 큰 필드가있는 경우 특히 반환되는 데이터 측면에서 더 효율적입니다) .

참고 : 귀하의 질문은 여러 페이지에 걸쳐있는 문서에 대해 생각하고 있으며, 차이를 만들 수 있는지 여부 - 내가 연구/테스트해야하는 내용 - 흥미로울 수 있습니다.

그러나 엄밀히 말하자면 캐시에 저장되는 것은 문서 나 색인에 의해 결정되는 것이 아닙니다. Readahead도이 파일을 (적어도 Linux 용으로) 재생할 것이며, 문서 크기에 관계없이 4k 페이지를 모두 읽으므로 비효율적 요소가있을 수 있습니다. 문서의 크기와 단편화 수준에 따라 정확히 얼마나 달라질 수 있습니다. 그 주제에 더 많이 논의는 여기에서 찾을 수 :

https://serverfault.com/questions/408100/mongodb-and-datasets-that-dont-fit-in-ram-no-matter-how-hard-you-shove/408182#408182

+0

덕분에,이 내가 알고 싶어 정말로입니다! – Bart

관련 문제