我有一个包含如下文档的集合:
{
_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字段不是已经存储在索引中用来唯一标识记录了吗?
发布于 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,
db.saleReport
.find({reportId: "e6044e8a", "accountId":{$in: ["a","b"] })
.allowDiskUse()
.sort({"_id":1});我是否应该将
_id也添加为索引的一部分?
为什么没有应用 _id 和复合索引的交集?
请参见:当sort()操作需要完全独立于查询谓词的索引时,索引交集不适用。
你可以添加_id字段作为复合索引的一部分,如果你不想执行阻塞排序或内存排序操作,
db.saleReport.createIndex({reportId:1,accountId:1,_id:1});https://stackoverflow.com/questions/64882609
复制相似问题