gpt4 book ai didi

mongodb - 在 MongoDB 中缓存部分文档

转载 作者:可可西里 更新时间:2023-11-01 09:46:03 24 4
gpt4 key购买 nike

我非常熟悉缓存在 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 ),否则加载部分文档的任何操作都会将整个内容分页到内存中。因此,当您重新运行并更改返回的字段时,文档将在缓存中。

使用投影来限制某些字段仅意味着它不会返回您未指定的字段(因此它在返回数据方面更有效,特别是如果您有未使用的大字段)。

注意:您的问题让我想到了跨多个页面的文档,以及是否会有所不同 - 我需要研究/测试的东西,这可能很有趣。

然而,严格来说,放入缓存的内容并不仅仅是由文档或正在使用的索引决定的。 Readahead也会参与其中(至少对于 Linux),并且无论您的文档大小如何,您都将阅读完整的 4k 页,因此可能存在效率低下的因素。具体多少取决于您的文档大小和碎片化程度。在此处可以找到关于该主题的更多讨论:

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

关于mongodb - 在 MongoDB 中缓存部分文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13669967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com