Mongodb $near 查询 120 万份文档耗时 6 秒
Posted
技术标签:
【中文标题】Mongodb $near 查询 120 万份文档耗时 6 秒【英文标题】:Mongo $near query takes 6s on 1.2 millions documents 【发布时间】:2014-12-20 17:18:48 【问题描述】:我在 MongoDb 中插入了大约 120 万个相同的文档来测试地理空间索引的速度
这是一个查询:
db.spreads.find( loc: '$near': '$geometry': type: "Point" , coordinates: [40,40], '$maxDistance': 10000000 ).explain();
结果
"cursor" : "S2NearCursor",
"isMultiKey" : false,
"n" : 1568220,
"nscannedObjects" : 12545154,
"nscanned" : 12545154,
"nscannedObjectsAllPlans" : 12545154,
"nscannedAllPlans" : 12545154,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 11413,
"indexBounds" :
,
"server" : "s1.heychat.io:27017",
"filterSet" : false
索引:
db.spreads.getIndexes();
[
"v" : 1,
"key" :
"_id" : 1
,
"name" : "_id_",
"ns" : "test.spreads"
,
"v" : 1,
"key" :
"loc" : "2dsphere"
,
"name" : "loc_2dsphere",
"ns" : "test.spreads",
"2dsphereIndexVersion" : 2
]
为什么这么慢?
【问题讨论】:
您是否为您的收藏定义了正确的索引? 是的,用于 loc 字段的 2dsphere 据我所知,没有地理索引就没有办法使 $near 【参考方案1】:解释输出中的"n" : 1568220
表示查询返回了 150 万个文档。所以这就解释了为什么花了这么长时间。
使用更小的$maxDistance
可能是更好的测试。
【讨论】:
我已经尝试了 maxDistance 100 并且花费了 5981 毫秒。它仍然非常缓慢。可能是所有文档在集合中具有相同坐标的原因吗? 如果所有文档具有相同的坐标,那么空间搜索将返回零或所有记录,并且变得有点毫无意义(没有双关语)。 但它确实有效。 maxDistance 1 耗时 3 秒。谢谢!以上是关于Mongodb $near 查询 120 万份文档耗时 6 秒的主要内容,如果未能解决你的问题,请参考以下文章
具有稀疏复合索引的 MongoDB $near 地理空间查询错误 13311
如何在 mongoid dsl 中编写 mongodb $near 查询?