我目前正在从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" : {
}
这些索引是什么样的? – Sammaye 2013-05-08 11:39:56
原谅我缺乏知识。但我的索引只基于mongodb提供的默认值。这是由{“_id”:1}也许这解释了为什么需要时间使用时间戳排序,因为它还没有索引。但仍然使用_id进行排序,我无法获得令人满意的时间延迟。 – 2013-05-08 12:06:07
您将在sensorid和_id上添加复合索引,以提高效率。该索引看起来像{“sensorid”:1,“_id”:-1},这是第一个传感器升序和_id降序。有关MongoDB中复合索引的文档,请参阅以下页面:http://docs.mongodb.org/manual/core/indexes/#compound-indexes – 2013-05-08 12:52:01