[英]MongoDB query over indexed field very slow
我的馆藏中有大量文件(32 809 900)。 所有文档都有一个名为soft_deleted
的字段。 我还创建了soft_deleted: 1
字段。 然后,我测试了一些与该字段相关的不同查询。 这是我的结果:
Query Number of results Time in milliseconds
db.cgm_egvs
.find().count() 32809900 90
db.cgm_egvs
.find({soft_deleted: true}) 2820897 688
.count()
db.cgm_egvs
.find({soft_deleted: false}) 29989003 3983
.count()
db.cgm_egvs
.find({soft_deleted: null}) 0 42
.count()
db.cgm_egvs
.find({soft_deleted: {$ne: true}}) 29989003 82397
.count()
为什么这些查询之间的查询时间如此不同? 我希望找到soft_deleted
为true
或false
文档花费相同的时间。 更重要的是,为什么用!= true
查询比其他任何查询都要慢得多?
soft_deleted字段的基数非常低。 它只有两个不同的值true和false,因此在此字段上创建索引不会有太大好处。 通常,索引在具有高基数的字段上表现更好。
对于{soft_deleted:true}查询,与{soft_deleted:false}相比,带有soft_deleted:true的行数要少得多,并且mongodb必须扫描少得多的索引条目。 因此,{soft_deleted:true}查询花费的时间更少。
类似地,查询{soft_deleted:null}花费的时间更少,因为索引只有2个不同的值,在这种情况下,所需的扫描速度要低得多。
您的最终查询使用$ ne运算符,而$ ne运算符不是选择性的(选择性是查询使用索引缩小结果的能力)。 https://docs.mongodb.com/v3.0/faq/indexes/#using-ne-and-nin-in-a-query-is-slow-why 。 因此,执行花费了更多时间。
我不确定为什么其他查询会很慢(我正在等待解释转储),但是在$ ne的情况下,关键是我们在其中添加了额外的步骤,因此这意味着此函数先包装成等号,然后是不等号->请参阅以下parsedQuery部分中的说明转储,并查找不执行步骤
db.getCollection('a1')。find({Level:{$ ne:“ Info”}}})。explain()
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "logi.a1",
"indexFilterSet" : false,
"parsedQuery" : {
"$not" : {
"Level" : {
"$eq" : "Info"
}
}
},
db.getCollection('a1')。find({Level:“ Info”})。explain()
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "logi.a1",
"indexFilterSet" : false,
"parsedQuery" : {
"Level" : {
"$eq" : "Info"
}
},
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.