【问题标题】:Sparse index does not improve sort in MongoDB?稀疏索引不改进 MongoDB 中的排序?
【发布时间】:2019-01-17 06:28:23
【问题描述】:

我有一个包含 >100k 文档的集合。 一个示例文档就像

{ 
    "created_at" : 1545039649, 
    "priority" : 3, 
    "id" : 68, 
    "name" : "document68"
}


db.mycol.find().sort({created_at:1})

db.mycol.find().sort({priority:1})

导致错误。

Error: error: {
    "ok" : 0,
    "errmsg" : "Executor error during find command: OperationFailed: Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.",
    "code" : 96,
    "codeName" : "OperationFailed"
}

然后我索引了这些字段。

db.mycol.createIndex({'priority':1})
db.mycol.createIndex({'created_at':1}, {sparse:true})

created_at 添加了稀疏索引,因为它是必填字段。

现在

db.mycol.find().sort({priority:1})

给出结果。但是

db.mycol.find().sort({created_at:1})

仍然会导致同样的错误。

【问题讨论】:

    标签: mongodb sorting indexing mongodb-query


    【解决方案1】:

    仅当您按created_at: {$exists: true} 过滤时,才能使用稀疏索引。

    原因是所有其他记录都不是索引的一部分(但它们仍然应该出现在结果中——可能在最后)。

    也许您不必使索引稀疏(这仅在大多数记录没有该字段时才有意义 - 否则您无论如何都不会在索引存储中节省太多空间)? created_at 听起来大多数唱片都会有。

    为 created_at 添加了稀疏索引,因为它是必填字段。

    实际上,恰恰相反:当字段是可选的(并且非常少见)时,您只需要稀疏索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-22
      • 2013-06-12
      • 2018-06-12
      • 1970-01-01
      • 2015-02-15
      • 2021-03-12
      • 1970-01-01
      • 2012-07-07
      相关资源
      最近更新 更多