首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对_id唯一索引进行排序的Mongodb复合索引

对_id唯一索引进行排序的Mongodb复合索引
EN

Stack Overflow用户
提问于 2020-11-18 04:09:28
回答 1查看 154关注 0票数 2

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

代码语言:javascript
复制
{
  _id: "",
  reportId: "a",
  accountId: "",
   ....
 }

现在我的查询模式如下:

代码语言:javascript
复制
db.saleReport.find({reportId: "e6044e8a", "accountId":{$in: ["a","b"] }).sort({"_id":1});

我用以下命令创建了一个复合索引:

代码语言:javascript
复制
db.saleReport.createIndex({reportId:1,accountId:1})

上面的索引仅在查询阶段使用。甚至还添加了一个排序阶段,用于对_id字段进行排序。

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

EN

回答 1

Stack Overflow用户

发布于 2021-05-09 03:27:47

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

是的,这将执行排序操作,但是,它意味着在内存排序操作中,

阻塞排序的行为:

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

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

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

代码语言:javascript
复制
db.saleReport
  .find({reportId: "e6044e8a", "accountId":{$in: ["a","b"] })
  .allowDiskUse()
  .sort({"_id":1});

我是否应该将_id也添加为索引的一部分?

为什么没有应用 _id 和复合索引的交集?

请参见:当sort()操作需要完全独立于查询谓词的索引时,索引交集不适用。

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

代码语言:javascript
复制
db.saleReport.createIndex({reportId:1,accountId:1,_id:1});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64882609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档