【问题标题】:Mongodb compound index with sort on _id unique index对 _id 唯一索引进行排序的 Mongodb 复合索引
【发布时间】:2020-11-17 20:09:28
【问题描述】:

我有一个包含如下文档的集合:

{
  _id: "",
  reportId: "a",
  accountId: "",
   ....
 }

现在我的查询模式是这样的:

db.saleReport.find({reportId: "e6044e8a", "accountId":{$in: ["a","b"] }).sort({"_id":1});

我创建了一个复合索引:

db.saleReport.createIndex({reportId:1,accountId:1})

上述索引仅在查询阶段使用。甚至添加了一个排序阶段以对_id 字段进行排序。

我应该添加_id 作为索引的一部分吗? _id字段不是已经存储在索引中来唯一标识记录了吗?

【问题讨论】:

  • 你最后做了什么? _id 索引是必要的吗?
  • 是的,这是必要的。

标签: mongodb mongodb-indexes


【解决方案1】:

_id 字段不是已经存储在索引中以唯一标识记录了吗?

是的,这会执行排序操作,但是Blocking Sort Operation,这意味着在内存中排序操作,

阻塞排序的行为:

要检查 MongoDB 是否必须执行阻塞排序,请将 cursor.explain() 附加到查询并检查解释结果。如果查询计划包含 SORT 阶段,则 MongoDB 必须执行受 100 MB 内存限制的阻塞排序操作。

如果 MongoDB 需要使用超过 100 兆字节的系统内存来进行阻塞排序操作,MongoDB 会返回错误,除非查询指定 cursor.allowDiskUse()(MongoDB 4.4 中的新功能)。 allowDiskUse() 允许 MongoDB 在处理阻塞排序操作时使用磁盘上的临时文件来存储超过 100 MB 系统内存限制的数据。

如果您不想在复合索引中添加 _id 字段,您可以在 MongoDB 4.4 的 find 方法中使用 allowDiskUse

db.saleReport
  .find({reportId: "e6044e8a", "accountId":{$in: ["a","b"] })
  .allowDiskUse()
  .sort({"_id":1});

我应该添加_id 作为索引的一部分吗?

为什么_id和复合索引的交集不适用?

参见Index Intersection and Sortsort() 操作需要与查询谓词完全分离的索引时,索引交集不适用。

是的,如果您不想执行阻塞排序或内存排序操作,您绝对可以将 _id 字段添加为复合索引的一部分,

db.saleReport.createIndex({reportId:1,accountId:1,_id:1});

【讨论】:

    猜你喜欢
    • 2018-03-09
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2019-02-23
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    相关资源
    最近更新 更多