You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,可以使用覆盖索引实现:

  1. 只查询索引中包含的字段:
db.Users.find({ name: 'John' }, { name: 1, _id: 0 })

此时MongoDB可以直接从索引中获取数据,不需要读取集合文档,totalDocsExamined会变成0。

  1. 创建包含所有需要返回字段的复合索引:
db.Users.createIndex({ name: 1, age: 1 })

之后执行原查询,MongoDB能直接从索引中获取所有需要返回的字段数据,无需读取集合文档。


内容的提问来源于stack exchange,提问作者Chicky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 07:35:30