【问题标题】:Mongodb 2.4 2dsphere queries very slowMongodb 2.4 2dsphere 查询非常慢
【发布时间】:2013-07-09 01:01:24
【问题描述】:

我已将使用 mongodb“2d”索引的旧集合转换为具有 geojson 规范“2dsphere”索引的集合。问题是查询大约需要 11 秒来执行大约 2 个 lac 对象的集合。以前查询大约需要 100 毫秒。我的文件如下。

{ "_id": ObjectId("4f9c2aa2d142b9882f02a3b3"), "geonameId": NumberInt(1106542), "name": "Chitungwiza", "feature code": "PPL", "country code": "ZW", "state": "Harare Province", "population": NumberInt(340360), "elevation": "", "timezone": "Africa\/Harare", "geolocation": { "type": "Point", "coordinates": { "0": 31.07555, "1": -18.01274 } } }

我的解释查询输出如下。

db.city_info.find({"geolocation":{'$near':{ '$geometry': { 'type':"Point",coordinates:[73,23] } }}}).explain()

{
"cursor" : "S2NearCursor",
"isMultiKey" : true,
"n" : 172980,
"nscannedObjects" : 172980,
"nscanned" : 1121804,
"nscannedObjectsAllPlans" : 172980,
"nscannedAllPlans" : 1121804,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 13,
"nChunkSkips" : 0,
"millis" : 13841,
"indexBounds" : {

},
"nscanned" : 1121804,
"matchTested" : NumberLong(191431),
"geoMatchTested" : NumberLong(191431),
"numShells" : NumberLong(373),
"keyGeoSkip" : NumberLong(930373),
"returnSkip" : NumberLong(933610),
"btreeDups" : NumberLong(0),
"inAnnulusTested" : NumberLong(191431),
"server" : "..."
}

请告诉我如何纠正问题并减少查询时间。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    $near 命令不需要您建议的“2dsphere”数据库的 $maxDistance 参数。添加 $maxDistance 只是指定了一个范围,将查询结果的数量减少到一个可管理的数量。您的体验从“2d”更改为“2dsphere”样式索引的原因是,如果未指定“2d”索引,则默认限制为 100。如您所见,2dsphere 索引的默认查询计划没有施加这样的限制,因此查询正在扫描整个索引(“nscannedObjects”:172980)。如果您在“2d”索引上运行相同的查询,您会看到“n”和“nscannedObjects”只有 100,这解释了成本差异。

    如果您的所有项目都在 $maxDistance 范围内(例如,尝试使用 $maxDistance 20M 米),您将看到查询性能下降到没有它时的水平。在任何一种情况下,使用 limit() 来告诉查询计划仅扫描索引中必要的结果以防止失控非常重要,尤其是对于较大的数据集。

    【讨论】:

    • 这是一个可以接受的答案,对吧?你有机会帮我做吗?
    • 想评论一下您为什么不赞成这个答案?没错。
    • 我意识到这已经很老了,但补充一下,我正在对 2dsphere 索引和 2d 索引运行 $near 查询,数据完全相同。两者都限制为 100,但 2d 索引查询在 0.2s 内返回,2dsphere 索引查询需要 10s+ .. 所以我不认为使用 limit 是正确的答案
    【解决方案2】:

    我已经解决了这个问题。 $near 命令需要这里指定的 $maxDistance 参数:http://docs.mongodb.org/manual/applications/2dsphere/。只要我提供了 $maxDistance,查询时间就减少到不到 100 毫秒。

    【讨论】:

    • $near 不需要 $maxDistance。根据您的要求,您执行的查询成功并正确返回。
    猜你喜欢
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 2019-01-21
    相关资源
    最近更新 更多