2014-10-22 56 views
0

我看起来像这样的文件:mongodb使用什么索引?

{ 
    { 
     "_id": ObjectId("5444fc67931f8b040eeca671"), 
     "meta": { 
     "SessionID": "45", 
     "configVersion": "1", 
     "DeviceID": "55", 
     "parentObjectID": "55", 
     "nodeClass": "79", 
     "dnProperty": "16" 
     }, 
     "cfg": { 
     "Name": "test" 
     } 
    } 

的名称和数据只是为了测试个大气压。但我在数据库中共有2500万个文件。我在这个find()中使用find()来获取特定的文档。在这种情况下,我使用四个参数,dnProperty,nodeClass,DeviceID和configVersion,它们都不是唯一的。

Atm。我的索引设置很简单:

ensureIndex([["nodeClass", 1],["DeviceID", 1],["configVersion", 1], ["dnProperty",1]]) 

换句话说我有四个参数的索引。如果您执行的搜索没有找到任何文档,我仍然遇到很多问题。在我的例子中,所有的“数据”在1-100之间是随机的,所以如果我使用其中一个值大于100的find(),则需要30-180秒的任何时间来执行搜索,它也使用我所有的8GB RAM,那么由于没有RAM,计算机变得非常慢。

什么是更好的索引?我使用索引是否正确?我是否只需要更多的内存,因为它会将数据库的“全部”放入其工作内存中?你会推荐另一个数据库(mongo除外)来处理这个更好吗?

对不起,有很多问题我希望它们足够短,你可以给我一个答案。

+0

您能向我们展示您的慢查询吗? – joao 2014-10-22 07:45:37

+0

2500万个文件很多。你可以考虑这些事情:使用多个集合来分割数据;使用数据集(如google bigquery)其快速和类似于SQL。 – 2014-10-22 07:46:10

回答

1

MongoDB使用内存映射文件,这意味着您的数据和索引副本存储在RAM中,并且每当有查询时它就从RAM本身获取它。在当前场景中,查询速度较慢,因为您的数据+索引大小太大以至于无法放入RAM中,因此将会有大量I/O活动从磁盘获取数据,这是瓶颈。

拆分解决这个问题的帮助,因为如果你的分区/分片间的资料,例如,然后5台机器,你将有8GB * 5 = 40GB的RAM,可容纳你的(数据集+指标=工作集)的RAM本身和I/O开销将会减少,从而提高性能。

因此,在这种情况下,您的索引不会有助于提高超出特定点的性能,您将需要在多台机器上分割您的数据。分片将趋于增加读取以及线性写入吞吐量。 Sharding in MongoDB