MongoDB使用索引查询时,为何totalDocsExamined仍大于0?
问题背景
我对MongoDB的totalKeysExamined和totalDocsExamined字段的理解是:
totalKeysExamined:扫描的索引条目数量totalDocsExamined:查询执行期间从集合中取出检查的文档数量
现有如下场景:
- 集合
Users的结构:
{ name: String, age: Number }
- 为该集合创建索引
name_1:{ name: 1 } - 查询语句:
db.Users.find({ name: 'John' }) - 执行
db.Users.find({ name: 'John' }).explain('executionStats')后,关键结果为:
"totalKeysExamined" : 1, "totalDocsExamined" : 1
明明查询完全匹配索引,为什么totalDocsExamined不为0,MongoDB还要从集合中取出文档检查?
原因解释
这是因为你的查询需要返回完整的文档内容,而你创建的name_1索引里只存储了name字段的值和对应文档的位置指针,并没有包含age字段的数据。
当MongoDB通过IXSCAN阶段找到匹配的索引条目后,必须通过FETCH阶段根据索引里的指针去集合中取出完整的文档,才能把包含name和age的完整数据返回给你,这就导致了totalDocsExamined为1。
如果想让totalDocsExamined变为0,可以使用覆盖索引实现:
- 只查询索引中包含的字段:
db.Users.find({ name: 'John' }, { name: 1, _id: 0 })
此时MongoDB可以直接从索引中获取数据,不需要读取集合文档,totalDocsExamined会变成0。
- 创建包含所有需要返回字段的复合索引:
db.Users.createIndex({ name: 1, age: 1 })
之后执行原查询,MongoDB能直接从索引中获取所有需要返回的字段数据,无需读取集合文档。
内容的提问来源于stack exchange,提问作者Chicky
相关产品推荐
相关产品推荐

