查询1000万份mongodb文件

时间:2012-09-18 18:00:00

标签: php mongodb

我在mongodb文档中存储名称,作者,价格,出版商等书籍元数据。我有大约1000万份这些文件,它们都在一个集合中。 平均文档大小为1.9 KB 。现在我有nameauthorsprice的索引。实际上我有2个索引,价格一个按升序排列,一个降序。我的mongodb版本是2.2.0,我使用PHP驱动程序来查询mongo。驱动程序的版本是1.12。但是当我对价格进行范围查询时,我得到MongoCursorTimeoutException。在我的查询中,我试图找到一定价格范围内的书籍,如“价格低于1000且超过500”。

增加超时似乎不是一个好主意(已经是30秒)。还有什么我可以做的,以加快查询过程。

修改 其实我的价格指数是复合的。我有一个状态字段,其中包含一个整数值,因此我的价格指数看起来像{price:-1,status:1}{price:1,status:1} 此外,我正在尝试使用PHP一次检索20个文档。

3 个答案:

答案 0 :(得分:5)

我们在使用传统和SSD EBS卷的EC2上使用单/共享服务器和专用副本集的Mongo集合中拥有数百万个文档的丰富经验。工作负载是多种多样的:一些是面向分析的,另一些是支持Web请求。这是我建议的根本原因分析路径:

  1. 使用.explain()运行查询,以查看所使用的索引的进展情况等。如有必要,请调整索引。 Mongo的优化器相当天真,所以如果你的索引与查询模式不完全匹配,它们可能会被遗漏。

  2. 检查MMS并查找以下任何问题:(1)并非内存中的所有数据(由页面错误指示)和(2)队列长度(通常表示某种类型的瓶颈)。当并非所有数据都在内存中时,Mongo的性能会迅速下降,因为数据库只有一个全局锁定和触摸存储,特别是在云端是坏消息。我们最近升级到SSD云存储,我们看到数据库的性能提高了3-10倍,大小约为1/2 Tb。

  3. 将性能分析级别提高到2(最大值),运行一段时间并查看操作日志。请参阅MongoDB profiler

  4. 希望这有帮助。

答案 1 :(得分:1)

  1. 检查您的欠款。重新索引数据,并确保在运行查询之前完全索引集合。 (10英里。文档可能需要一段时间才能编制索引)
  2. 任何索引查询中最慢的部分是实际的文档检索。我可以想象,根据您提取的文档数量,这可能需要30秒或更长时间以及大量内存。
  3. 有关某些内容的更多有用说明,请尝试查看此页面: http://www.mongodb.org/display/DOCS/Optimization

    10英里。您可能还会考虑在计算机之间分片数据的文档。请记住,硬盘驱动器读取速度比cpu周期慢。

答案 2 :(得分:0)

@JohnyHK说我的RAM太低了。所以它增加到12 GB,现在可以使用了。感谢大家的意见和答案