什么指数用于mongodb?

时间:2014-10-22 07:37:21

标签: mongodb

我的文件看起来像这样:

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

名称和数据仅用于测试atm。但我在DB中总共有2500万个文档。我正在使用find()来获取此find()中的特定文档。在这种情况下我使用四个参数,dnProperty,nodeClass,DeviceID和configVersion它们都不是唯一的。

大气压。我的索引设置简单如下:

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

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

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

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

1 个答案:

答案 0 :(得分:1)

MongoDB使用内存映射文件,这意味着数据和索引的副本存储在RAM中,只要有查询,它就会从RAM本身获取它。在当前场景中,您的查询速度较慢,因为您的数据+索引大小太大而无法容纳在RAM中,因此从磁盘获取数据会有很多I / O活动,这是瓶颈。

Sharding有助于解决这个问题,因为如果您对数据进行分区/分片,例如5台机器,那么您将拥有8GB * 5 = 40GB的RAM,它可以将您的(数据集+索引=工作集)保存在RAM本身和开销中I / O将减少,从而提高性能。

因此,在这种情况下,您的索引无法帮助提高性能超过某一点,您需要在多台计算机上对数据进行分片。分片将倾向于线性增加读取和写入吞吐量。 Sharding in MongoDB