【问题标题】:MongoDB can not find() in 1 million documentsMongoDB 在 100 万个文档中找不到()
【发布时间】:2015-01-06 13:22:23
【问题描述】:

我刚开始接触 MongoDB。 创建了 1 万个 json 文档。我会搜索:

db.mycollection.find({"somenode1.somenode2.somenode3.somenode4.Value", "9999"}).count()

它给出了正确的结果。操作时间:34 毫秒。一切正常。

现在创建一个包含 100 万个相同文档的数据库。数据库的总大小为 34Gb。MongoDB 将数据库按 2Gb 划分为文件。我重复上述查询以查找相关文档的数量。我等了大约2个小时的结果。内存被占用(16GB)。最后我关闭了Mongo。 系统:Windows 7 x64,16Gb RAM。

请告诉我我做错了什么。生产数据库会更大。

【问题讨论】:

  • 你最大的问题是如果你嵌套那么深,你就没有正确地建模你的数据。
  • 您需要仔细索引这样的大型集合以获得良好的性能。否则需要将整个 34GB 集合读入内存。
  • Sammaye,我使用这个数据库作为大型 json 文档的存储。我无法更改文档的结构。
  • JohnnyHK,显然你是对的。唯一的方法是使用索引。

标签: mongodb


【解决方案1】:

在您的特定情况下,您似乎根本没有足够的 RAM。至少,“somenode4”上的索引会提高查询性能。请记住,索引也需要在 RAM 中,因此您可能需要更多 RAM。你是在虚拟机上吗?如果是这样的话;我建议您增加机器的大小以适应工作集的大小。

正如另一位评论者所说,嵌套有点难看,但我知道这是你所处理的。所以除了 RAM,索引似乎是你最好的选择。

作为索引工作的一部分,您可能还想尝试预热索引,以确保在 find 和 count() 之前它们在 RAM 中。尝试执行一个查询来寻找不存在的东西。这应该在查询之前强制索引和数据进入 RAM。根据数据更改的频率,您可能希望每天执行一次或更多次。您实际上是在预先加载缓慢的操作。

【讨论】:

  • 谢谢狄龙。我在我的工作机器上玩 Mongo。当然,真正的服务器会拥有更多的内存,但是拥有与存储数据一样多的 RAM 是不可接受的。我将开始研究 Mongo 索引。总的来说,我正在寻找 json 文档的大数据存储,它允许进行性能良好的深度搜索。
  • 根据您的上一条消息,我建议探索分片。真的是“分区”。
  • 在您的通用示例中没有立即跳出分片键,但您可以选择基于散列的分片。这将允许您抵消许多虚拟机而不是一台大型服务器上的 RAM 需求。另一个考虑因素是查看聚合框架的组计数。我对 Mongo 中的聚合框架做的不多,所以我不能详细说明。
猜你喜欢
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 2013-07-06
相关资源
最近更新 更多