Mongodb 2.4 2dsphere查询非常慢

时间:2013-03-28 06:05:23

标签: mongodb

我已经使用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" : "..."
}

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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