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

MongoDB $near 查询准确性问题

如何在 mongoid dsl 中编写 mongodb $near 查询?

使用 java 的 MongoDb $near 查询没有给出正确的位置

Mongodb $near 二级排序顺序

使用 mongolite(R 和 MongoDB)运行查询时出错