Php 查询1000万个mongodb文档

Php 查询1000万个mongodb文档,php,mongodb,Php,Mongodb,我在mongodb文档中存储书籍元数据,如姓名、作者、价格、出版商等。我有大约1000万份这样的文件,它们都在一个集合中。文档的平均大小为1.9KB。现在我有了name、authors和price的索引。事实上,我有两个价格指数,一个是升序,一个是降序。我的mongodb版本是2.2.0,我正在使用php驱动程序查询mongo。驱动程序的版本是1.12。但当我对价格进行范围查询时,会得到一个MongoCorSortimeoutException。在我的查询中,我试图找到特定价格范围内的书籍,如“

我在mongodb文档中存储书籍元数据,如姓名、作者、价格、出版商等。我有大约1000万份这样的文件,它们都在一个集合中。文档的平均大小为1.9KB。现在我有了
name
authors
price
的索引。事实上,我有两个价格指数,一个是升序,一个是降序。我的mongodb版本是2.2.0,我正在使用php驱动程序查询mongo。驱动程序的版本是1.12。但当我对价格进行范围查询时,会得到一个
MongoCorSortimeoutException
。在我的查询中,我试图找到特定价格范围内的书籍,如“价格低于1000和高于500”

增加超时时间似乎不是一个好主意(已经是30秒了)。我还能做些什么来加快查询过程吗

编辑 实际上我的价格指数是复合的。我有一个状态字段,它有一个整数值,所以我的价格指数看起来像
{price:-1,status:1}
{price:1,status:1}

我还试图用PHP一次检索20个文档

  • 检查你的不雅行为。重新为数据编制索引,并确保在运行查询之前对集合进行了完全索引。(10英里。索引文档可能需要一段时间)
  • 任何索引查询中最慢的部分是实际的文档检索。我可以想象,根据您正在提取的文档数量,这可能需要30秒或更长时间和大量内存 有关某些方面的更多有用说明,您可以尝试查看此页面:


    10英里。您还可以考虑在计算机之间共享数据。请记住,硬盘读取速度比cpu周期慢。

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

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

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

  • 将分析级别增加到2(最大值),运行一段时间并查看操作日志。看


  • 希望这有帮助。

    因为@JohnyHK说我的RAM太低了。因此,它增加到12GB,现在可以工作了。感谢大家的评论和回答

    memcached?这是18场演出,难怪。你安装了多少内存?@iccthedral我有8GB内存。但我的总索引大小约为6GB。所以我有足够的内存来保存我的索引,在价格上有单独的升序和降序索引是一种浪费。单字段索引的方向。移除其中一个以释放一些索引RAM。@JohnnyHK实际上我的价格指数是复合的。我有一个状态字段,它有一个整数值,所以我的价格指数看起来像
    {price:-1,status:1}
    {price:1,status:1}
    @lovesh OK;即使如此,也要确保使用
    explain
    来确保这两个索引都被使用。无论如何,拥有6GB的索引和8GB的RAM感觉太紧了。我试图一次检索20个文档,所以
    limit
    是20