13

我将书籍元数据(如名称、作者、价格、出版商等)存储在 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 个文档。

4

3 回答 3

5

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

  1. 运行查询.explain()以查看使用的索引等方面的情况。如有必要,请调整索引。Mongo 的优化器相当幼稚,因此如果您的索引与查询模式不完全匹配,它们可能会被遗漏。

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

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

希望这可以帮助。

于 2012-10-13T05:56:28.620 回答
2
  1. 检查你的不雅行为。重新索引您的数据,并确保在运行查询之前对集合进行完全索引。(10 英里。文档可能需要一段时间才能建立索引)
  2. 任何索引查询中最慢的部分是实际的文档检索。我可以想象,根据您提取的文档数量,这可能需要 30 秒或更长时间以及大量内存。

有关某些事情的更多有用说明,您可以尝试查看此页面: http ://www.mongodb.org/display/DOCS/Optimization

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

于 2012-09-21T18:22:18.197 回答
1

正如@JohnyHK 所说,我的内存太低了。所以将它增加到 12 GB,它现在可以工作了。感谢大家的评论和回答

于 2012-12-21T17:03:02.867 回答