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

Posted

技术标签:

【中文标题】MongoDB,即使它们形成分区,查询字段也会减慢查询速度吗?【英文标题】:MongoDB, can query fields slow down a query even if they form a partition? 【发布时间】:2016-08-13 13:46:47 【问题描述】:

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

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

比这个慢:

User.find()

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

【问题讨论】:

【参考方案1】:

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

db.User.find( 性别: $in: ['male','female'] ).explain("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().explain("executionStats")


    "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

【讨论】:

感谢您的回答。当您说“这是一个很好的查询”时,您指的是哪一个?我不确定我是否理解你的意思 @Radioreve 我应该说好问题。 :-) 很晚了【参考方案2】:

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

【讨论】:

以上是关于MongoDB,即使它们形成分区,查询字段也会减慢查询速度吗?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB:即使查询的所有字段都被索引,为啥我的扫描对象值很高?

CSS3 PIE:圆角减慢 IE9,即使它本机支持它们

mongodb查询,如何只查询出某一个字段的值?

查询减慢网站速度,必须使它们执行得更快

即使应用程序关闭,Xamarin 也会为数据同步形成后台服务

为啥这个 PHP MongoDB 查询即使有结果也不返回任何结果?