MongoDB,即使查询形成分区,查询字段也会减慢查询速度?

时间:2016-04-20 17:40:57

标签: mongodb performance mongoose mongodb-query

假设我的用户集中只有 男性和女性。如下:

User.find({ gender: { $in: ['male','female'] }})

慢于这个:

User.find()

我觉得它会是,但我真的不知道MongoDB如何在内部工作。两个请求都返回整个集合。我正在构建一个过滤器功能,我想通过考虑每个调用都以某种方式进行过滤来简化我的api代码。

2 个答案:

答案 0 :(得分:2)

这是一个很好的问题,因为它触及了基本的查询规划功能。 比较 explain 结果,我们可以看到使用IN调用指定查询参数的集合扫描 - 当查询没有参数时,它比基本文档转储更昂贵。

  

db.User.find({性别:{$ in:['男性','女性']}})。解释(" executionStats")

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "test.User",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "gender" : {
                "$in" : [ 
                    "female", 
                    "male"
                ]
            }
        },
        "winningPlan" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "gender" : {
                    "$in" : [ 
                        "female", 
                        "male"
                    ]
                }
            },
            "direction" : "forward"
        },
        "rejectedPlans" : []
    },
    "executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 24,
        "executionTimeMillis" : 0,
        "totalKeysExamined" : 0,
        "totalDocsExamined" : 24,
        "executionStages" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "gender" : {
                    "$in" : [ 
                        "female", 
                        "male"
                    ]
                }
            },
            "nReturned" : 24,
            "executionTimeMillisEstimate" : 0,
            "works" : 26,
            "advanced" : 24,
            "needTime" : 1,
            "needYield" : 0,
            "saveState" : 0,
            "restoreState" : 0,
            "isEOF" : 1,
            "invalidates" : 0,
            "direction" : "forward",
            "docsExamined" : 24
        }
    },
    "serverInfo" : {
        "host" : "greg",
        "port" : 27017,
        "version" : "3.2.3",
        "gitVersion" : "b326ba837cf6f49d65c2f85e1b70f6f31ece7937"
    },
    "ok" : 1
}
  

db.User.find()解释。(" executionStats&#34)

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "test.User",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "$and" : []
        },
        "winningPlan" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "$and" : []
            },
            "direction" : "forward"
        },
        "rejectedPlans" : []
    },
    "executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 24,
        "executionTimeMillis" : 0,
        "totalKeysExamined" : 0,
        "totalDocsExamined" : 24,
        "executionStages" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "$and" : []
            },
            "nReturned" : 24,
            "executionTimeMillisEstimate" : 0,
            "works" : 26,
            "advanced" : 24,
            "needTime" : 1,
            "needYield" : 0,
            "saveState" : 0,
            "restoreState" : 0,
            "isEOF" : 1,
            "invalidates" : 0,
            "direction" : "forward",
            "docsExamined" : 24
        }
    },
    "serverInfo" : {
        "host" : "greg",
        "port" : 27017,
        "version" : "3.2.3",
        "gitVersion" : "b326ba837cf6f49d65c2f85e1b70f6f31ece7937"
    },
    "ok" : 1
}

答案 1 :(得分:0)

在没有条件的情况下查询时,它会返回所有文档而不进行检查。但如果你和一个条件。只需将条件编译成BSON并与数据库中的数据匹配,这比较慢。但是如果你创建一个性别指数。您无法看到任何时间差异(在两种情况下)