【问题标题】:Slow (high latency) upon queries with sort mongoDB使用 sort mongoDB 查询时慢(高延迟)
【发布时间】:2013-05-08 11:38:22
【问题描述】:

我目前正在从 couchdb 迁移到 mongodb,仍在学习这些东西,并且每当我在网页中进行一些排序查询时都会遇到问题。 我使用 codeigniter 作为框架,并使用 alexbilbie lib 作为 mongodb php 库。

所以,这是我的问题: 我打算从每秒更新的房间中的传感器进行查询(因此,已经保存了数千个文档在集合中)并获取每个最新的传感器值,我使用模型中的这个查询:

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" : {

    }

【问题讨论】:

  • 索引是什么样的?
  • 请原谅我缺乏知识。但我的索引仅基于 mongodb 提供的默认值。这是 {"_id":1} 也许这解释了为什么使用时间戳对其进行排序需要时间,因为它还没有被索引。但即使使用 _id 进行排序,我也无法获得令人满意的延迟时间。
  • 您将在 sensorid 和 _id 上添加复合索引以提高效率。索引看起来像 {"sensorid": 1, "_id": -1},它是第一个 sensorid 升序和 _id 降序。有关 MongoDB 中复合索引的文档,请参见以下页面:docs.mongodb.org/manual/core/indexes/#compound-indexes
  • 您可以在此帖子中添加explain() 以供您查询吗?
  • 为什么要多次调用多个传感器?您应该只查询一次使用 {$in:[ ]} 运算符给出 sensorId 列表。然后确保您在 {"sensorId":1, _id:1} 上有一个复合索引,它应该是一个快速的调用并返回您需要在该页面上拥有的所有文档。如果您需要按时间戳排序,请将该索引中的 _id 替换为时间戳。

标签: codeigniter mongodb mongodb-php


【解决方案1】:

好的,谢谢大家的精彩回复 :) 这是我尝试使用索引后的发现:

  1. 将 mongodb 更新到最新版本。我发现这稍微改善了我的查询。我正在从 ubuntu 12.04.02 中默认提供的默认 2.0.3 更新到 mongodb 版本 2.4.3
  2. 完全根据您在查询中最需要的方式构建索引/复合索引。例如,在我的问题中,我的查询基于 SensorId_id: DESCENDING 所以优化我的查询的最佳策略是这样的: 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

希望这能帮助其他遇到类似问题的人...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-06
    • 2013-03-04
    • 1970-01-01
    • 2020-03-26
    • 2018-05-09
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多