【问题标题】:Why so many scanned Objects?为什么有这么多扫描的对象?
【发布时间】:2014-07-30 20:14:51
【问题描述】:

我有一个包含以下对象的表:

> db.shapes.find()
{ "_id" : "P1", "amenity" : "restaurant", "shape" : { "type" : "Point", 
"coordinates" : [ 2, 2 ] } }
{ "_id" : "P2", "amenity" : "restaurant", "shape" : { "type" : "Point", 
"coordinates" : [ 2, 4 ] } }
{ "_id" : "P3", "amenity" : "police", "shape" : { "type" : "Point", 
"coordinates" : [ 4, 2 ] } }
{ "_id" : "P4", "amenity" : "police", "shape" : { "type" : "Point", 
"coordinates" : [ 4, 4 ] } }

以下查询中的 explain() 给出了一个奇怪的(在我看来)结果:

> db.shapes.find({shape:{$nearSphere:{$geometry:{type: "Point", coordinates: 
 [0,0]}}}}, {id:1, amenity:1}).limit(2).explain()
{
        "cursor" : "S2NearCursor",
        "isMultiKey" : false,
        "n" : 2,
        "nscannedObjects" : 22,
        "nscanned" : 22,
        "nscannedObjectsAllPlans" : 22,
        "nscannedAllPlans" : 22,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 1,
        "indexBounds" : {

        },
        "server" : "DBTest:27017",
        "filterSet" : false
}

为什么要扫描这么多物体?我的意思是,桌子只有 4 对象和 mongodb 扫描 22 ?

感谢您的任何解释。

再见,安德烈


> db.shapes.find({shape:{$nearSphere:{$geometry:{type: "Point", coordinates:
...  [0,0]}}}}, {id:1, amenity:1}).limit(2).explain(1)
{
        "cursor" : "S2NearCursor",
        "isMultiKey" : false,
        "n" : 2,
        "nscannedObjects" : 22,
        "nscanned" : 22,
        "nscannedObjectsAllPlans" : 22,
        "nscannedAllPlans" : 22,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 1,
        "indexBounds" : {

        },
        "allPlans" : [
                {
                        "cursor" : "S2NearCursor",
                        "isMultiKey" : false,
                        "n" : 2,
                        "nscannedObjects" : 22,
                        "nscanned" : 22,
                        "scanAndOrder" : false,
                        "indexOnly" : false,
                        "nChunkSkips" : 0,
                        "indexBounds" : {

                        }
                }
        ],
        "server" : "DBTest:27017",
        "filterSet" : false,
        "stats" : {
                "type" : "LIMIT",
                "works" : 22,
                "yields" : 0,
                "unyields" : 0,
                "invalidates" : 0,
                "advanced" : 2,
                "needTime" : 20,
                "needFetch" : 0,
                "isEOF" : 1,
                "children" : [
                        {
                                "type" : "PROJECTION",
                                "works" : 22,
                                "yields" : 0,
                                "unyields" : 0,
                                "invalidates" : 0,
                                "advanced" : 2,
                                "needTime" : 0,
                                "needFetch" : 0,
                                "isEOF" : 0,
                                "children" : [
                                        {
                                                "type" : "GEO_NEAR_2DSPHERE",
                                                "works" : 22,
                                                "yields" : 0,
                                                "unyields" : 0,
                                                "invalidates" : 0,
                                                "advanced" : 2,
                                                "needTime" : 0,
                                                "needFetch" : 0,
                                                "isEOF" : 0,
                                                "children" : [ ]
                                        }
                                ]
                        }
                ]
        }
}

【问题讨论】:

  • 如果您输入一个 $maxDistance 值会发生什么,作为一个感兴趣的问题。我认为你在 shape 字段上有一个 2dsphere 索引?
  • 是的,形状字段上有一个 2dsphere-Index。
  • 如果添加到查询中,$maxDistance 会做什么?
  • 请显示解释({详细:真实})

标签: mongodb spatial sql-execution-plan


【解决方案1】:

看起来您使用的是 2.4 版,并且遇到了在 2.6 版中修复的 https://jira.mongodb.org/browse/SERVER-12231。如果升级,您可能不会再在 explain() 输出中看到虚假的 nscanned 数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2014-08-21
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多