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:即使查询的所有字段都被索引,为啥我的扫描对象值很高?