2013-05-08 232 views
0

我目前正在从couchdb迁移到mongodb,仍然在学习这些东西,并且随时都会遇到问题,我会在网页中进行排序。 我使用codeigniter作为框架,并使用alexbilbie库为mongodb php库。对查询进行排序时mongoDB缓慢(高延迟)

所以,这里是我的问题: 我打算做从传感器查询该更新的每一秒的房间(因此,已保存在收集数以千计的文档),并获得我用这个查询从模型中的每个最新的传感器值:

function mongoGetDocLatestDoc($sensorid){ 
    $doc = $this->mongo_db->where(array('SensorId'=>$sensorid))->limit(1)->order_by(array('_id'=>'DESC'))->get('my_mongo'); 
    return $doc; 

} 

,如果我称这与我的控制器,它花了很多时间来处理查询和更糟糕,如果我通过时间戳更改排序。每次我为第二个传感器再次调用这个延迟时,延迟是延迟的两倍,更不用说我在同一页面中有超过10个传感器需要此查询。我做错了,还是有一些更有效的方法从收集中获取最新数据?

编辑: @Sammaye:我试图使基于你的建议的指数,这里是我后执行的查询的解释产生:

"cursor" : "BtreeCursor timestamp_desc", 
    "nscanned" : 326678, 
    "nscannedObjects" : 326678, 
    "n" : 50, 
    "millis" : 4402, 
    "nYields" : 7, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 
      "timestamp" : [ 
        [ 
          { 
            "$maxElement" : 1 
          }, 
          { 
            "$minElement" : 1 
          } 
        ] 
      ] 
    } 

按照比较,这解释了第一个查询不使用索引(即执行速度更快):

"cursor" : "BasicCursor", 
    "nscanned" : 385517, 
    "nscannedObjects" : 385517, 
    "n" : 50, 
    "millis" : 1138, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 

    } 
+0

这些索引是什么样的? – Sammaye 2013-05-08 11:39:56

+0

原谅我缺乏知识。但我的索引只基于mongodb提供的默认值。这是由{“_id”:1}也许这解释了为什么需要时间使用时间戳排序,因为它还没有索引。但仍然使用_id进行排序,我无法获得令人满意的时间延迟。 – 2013-05-08 12:06:07

+2

您将在sensorid和_id上添加复合索引,以提高效率。该索引看起来像{“sensorid”:1,“_id”:-1},这是第一个传感器升序和_id降序。有关MongoDB中复合索引的文档,请参阅以下页面:http://docs.mongodb.org/manual/core/indexes/#compound-indexes – 2013-05-08 12:52:01

回答

1

好感谢大家的极大反响:)这里是我的发现与索引尝试后:

  1. 将mongodb更新到最新版本。我发现这稍微改善了我的查询。我正在从默认的2.0.3更新到默认的ubuntu 12.04.02到mongodb 2.4.3的版本
  2. 根据您在查询中最需要的方式构建索引/复合索引。作为一个例子,在我的问题,我的查询基于SensorId_id:倒序所以要优化我查询的最佳策略是这样的: db.your_collection.ensureIndex({ "SourceId" : 1, "_id" : -1 },{ "name" : "sourceid_idx", "background" : true }); 或在其他情况下,如果我需要它基于时间戳:

    db.your_collection.ensureIndex({ "SourceId" : 1, "timestamp" : -1 },{ "name" : "source_idx", "background" : true });

我发现关于MongoDB的索引很好的解释here

希望这将有助于使得在同样的问题绊倒别人...