繁体   English   中英

MongoDB在索引字段上的查询非常慢

[英]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_deletedtruefalse文档花费相同的时间。 更重要的是,为什么用!= 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM