2017-02-17 93 views
1

我有一个大的mongodb集合(300万个文档,50千兆字节),即使创建了索引,查询数据也会非常缓慢。如何在大型mongodb集合中高效查询数据?

db.collection.find({"C123":1, "C122":2}) 

例如,该查询将超时或将极端缓慢(至少10秒),即使我已创建了C123C122的单独索引。

我应该创建更多索引还是增加物理内存来加速查询?

+0

怎么了聚合框架标签?问题中的查询不使用它。 –

+0

对不起,我认为'aggregate- $ match'与'find()'相同 – ppn029012

回答

0

答案很简单。

  1. 你并不需要创建索引,你需要创建正确的索引。字段c124上的索引将无助于字段c123上的查询,因此在创建它时没有意义。

  2. 使用更好的/更多的硬件。更多RAM,更多机器(分片)。

+0

问题是即使我为每个键创建了正确的索引,mongodb仍无法完成查询。我是否应该购买更好的硬件来运行此声明? – ppn029012

+0

@ ppn029012:如Alan的回答中所提到的,服务此确切查询的最佳索引是两个键上的复合索引。但很有可能,即使是这样,你目前的硬件也不能胜任。 –

+0

我需要多大的RAM来操作这个50GB的集合? – ppn029012

1

对于这样的查询,您应该创建复合索引。一个在两个领域。然后它应该是非常有效的。创建单独的索引对你来说无能为力,因为MongoDB引擎将首先使用第一部分查询的结果,但是如果使用第二部分将不会有多大帮助(甚至在某些情况下可能会减慢查询的速度索引表,然后再次在实际数据中)。您可以在shell中的查询中使用.explain()来确认使用的索引。

见复合索引:

https://docs.mongodb.com/manual/core/index-compound/

也可以考虑在这两个领域的排序方向,同时使索引。

+1

我想,Mongodb现在可以合并几年的索引。不过,化合物应该更好。 –

+0

好点@SergioTulentsev,我做了一个编辑,我知道合并,但根据我的经验,这在大多数情况下并没有什么帮助。但说实话,我们应该这么说。 –

+0

看来,我应该更多地考虑设计复合索引,因为这个集合中有400多个键。 – ppn029012

相关问题