可以使用 MongoDB 的查询计划(Explain Plan)来确认查询和排序是否涉及回表。执行 explain()
命令来查看查询计划:
db.collection.find({ _id: { $in: [ObjectId("60c72b2f5f1b2c6d88e3e3a1"), ObjectId("60c72b2f5f1b2c6d88e3e3a2")] })
.sort({ age: 1 })
.explain("executionStats");
查看输出中的 totalDocsExamined
和 totalKeysExamined
:
- 如果
totalDocsExamined
等于totalKeysExamined
,则说明查询和排序没有回表。 - 如果
totalDocsExamined
大于totalKeysExamined
,则说明查询和排序涉及回表。
结论
通过主键(_id
)使用 in
查询后再用另一个字段排序时,是否需要回表取决于索引的设计。创建合适的复合索引可以避免回表,从而提高查询和排序的性能。如果排序字段没有被索引覆盖,则可能需要回表获取排序字段的数据。