3

OSによってメモリマップされたファイルに関連して、MongoDBでキャッシュがどのように機能するかはよく知っています。しかし、それよりも詳細に興味があります...

たとえば、次の形式のドキュメントが 1 つのコレクションに含まれているとします。

{
  _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("...")})前のコマンドの後に実行すると、キャッシュが使用されますか?

ありがとう、
ズラトコ

4

1 に答える 1

2

クエリがインデックスだけで満たされない限り (つまり、カバーされたインデックスを使用する場合)、ドキュメントの一部をロードするアクションはすべてをメモリにページングします。したがって、返されたフィールドを再実行して変更すると、ドキュメントはキャッシュに残ります。

プロジェクションを使用して特定のフィールドに制限することは、指定していないフィールドを返さないことを意味します (したがって、特に使用していない大きなフィールドがある場合は、返されるデータに関してより効率的です)。

注:あなたの質問は、複数のページにまたがるドキュメントについて考えさせられ、それが違いを生む可能性があるかどうか-調査/テストする必要があるものであり、興味深いかもしれません.

ただし、厳密に言えば、何がキャッシュに入れられるかは、ドキュメントや使用されているインデックスだけによって決定されるわけではありません。 先読みも (少なくとも Linux の場合は) 機能し、ドキュメントのサイズに関係なく 4k ページ全体を読み取ることになるため、非効率な要素が存在する可能性があります。正確な量は、ドキュメントのサイズと断片化のレベルによって異なります。そのトピックに関するより多くの議論がここにあります:

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

于 2012-12-03T08:21:26.403 に答える