我有一个只有2文档的mongodb数据库。两者都有相同的结构:
{ "general" { "name": "abc", "sid": "435435"},"resources":[{"id":1,"cnt":20}] "messages" : []}小文档在消息中有0个对象,大1000。我数了两份文件中的标牌:小: 28000 : 450000。
我使用nodeJS与常规mongodb驱动程序一起访问文档,并将索引设置为"general.sid“。
现在我通过他们的general.sid请求文档。两份文件的时间都不一样!我收到文件,做一些计算和更新的文件general.resources。
在接收和更新文档之前和之后,我多次打印这个查询:
接收:小文档时间周期:1-2ms
接收:大文件时间周期:7-20 Big
写作:小文档时间周期:1-2ms
写作:大文档时间跨度:5-10 Big
接收功能的代码:
db.get().collection('player_data').find({"general.sid":UID}).limit(1).toArray(function (err, result){
if(err){
reject(null);
}
resolve(result);
});为什么会有这么大的差异?
我不是mongodb或nodejs的专家,所以如果你需要其他数据,请告诉我!
发布于 2021-03-24 15:02:00
这种差异来自于您已经说过的,文档大小的差异。
索引查询首先扫描索引B树,一旦找到匹配,就开始获取文档,而索引扫描特定文档的时间可能会有所不同(取决于树的大小,以及文档所在的树中的位置)。在您的示例中,一个包含2个文档的集合和一个在none数组字段上的简单索引查询的索引扫描部分将是相同的。
这将引导我们进入find查询的下一部分,将匹配的文档读入内存,在这里,可以将更多的字节加载到内存中,这并不奇怪。查询将花费更多时间。对于write函数,很难给出确切的解释,因为很多人都不知道Mongo是如何更新文档的,但是我想如果更新一个字段而不是消息数组,那么差异也是可以忽略不计的。
如果您要求为db提供一个更好的“设计模式”,这完全取决于您日常的需要,但是为了解决当前的问题,我建议将messages保存在单独的集合中。
https://stackoverflow.com/questions/66783251
复制相似问题