我在mongodb文档中存储名称,作者,价格,出版商等书籍元数据。我有大约1000万份这些文件,它们都在一个集合中。 平均文档大小为1.9 KB 。现在我有name
,authors
和price
的索引。实际上我有2个索引,价格一个按升序排列,一个降序。我的mongodb版本是2.2.0,我使用PHP驱动程序来查询mongo。驱动程序的版本是1.12。但是当我对价格进行范围查询时,我得到MongoCursorTimeoutException
。在我的查询中,我试图找到一定价格范围内的书籍,如“价格低于1000且超过500”。
增加超时似乎不是一个好主意(已经是30秒)。还有什么我可以做的,以加快查询过程。
修改
其实我的价格指数是复合的。我有一个状态字段,其中包含一个整数值,因此我的价格指数看起来像{price:-1,status:1}
和{price:1,status:1}
此外,我正在尝试使用PHP一次检索20个文档。
答案 0 :(得分:5)
我们在使用传统和SSD EBS卷的EC2上使用单/共享服务器和专用副本集的Mongo集合中拥有数百万个文档的丰富经验。工作负载是多种多样的:一些是面向分析的,另一些是支持Web请求。这是我建议的根本原因分析路径:
使用.explain()
运行查询,以查看所使用的索引的进展情况等。如有必要,请调整索引。 Mongo的优化器相当天真,所以如果你的索引与查询模式不完全匹配,它们可能会被遗漏。
检查MMS并查找以下任何问题:(1)并非内存中的所有数据(由页面错误指示)和(2)队列长度(通常表示某种类型的瓶颈)。当并非所有数据都在内存中时,Mongo的性能会迅速下降,因为数据库只有一个全局锁定和触摸存储,特别是在云端是坏消息。我们最近升级到SSD云存储,我们看到数据库的性能提高了3-10倍,大小约为1/2 Tb。
将性能分析级别提高到2(最大值),运行一段时间并查看操作日志。请参阅MongoDB profiler。
希望这有帮助。
答案 1 :(得分:1)
有关某些内容的更多有用说明,请尝试查看此页面: http://www.mongodb.org/display/DOCS/Optimization
10英里。您可能还会考虑在计算机之间分片数据的文档。请记住,硬盘驱动器读取速度比cpu周期慢。
答案 2 :(得分:0)
@JohnyHK说我的RAM太低了。所以它增加到12 GB,现在可以使用了。感谢大家的意见和答案