Skip to content

MongoDB 覆盖索引查询

什么是覆盖索引?

查询条件与所需返回字段全部落在同一索引的键上时,MongoDB 可以只读索引而不读集合文档,这类查询称为覆盖索引查询(covered query)。性能更好,IO 更少。

条件

  • 查询条件中的字段是索引键(或前缀)。
  • 投影只包含索引中的字段(及 _id;若索引包含 _id 则也可返回 _id)。
  • 查询未使用数组字段的多键索引等导致无法覆盖的情况。

示例

集合有索引 { name: 1, age: 1 }

javascript
// 可能被覆盖:只查 name,只返回 name 和 age(或含 _id)
db.users.find({ name: "张三" }, { name: 1, age: 1, _id: 0 })

若返回了索引中没有的字段(如 email),则无法覆盖,需要回表查文档。

查看是否覆盖

使用 explain() 查看执行计划:

javascript
db.users.find({ name: "张三" }, { name: 1, age: 1, _id: 0 }).explain("executionStats")

在返回结果中查看 totalDocsExamined 为 0 且使用了该索引时,一般为覆盖索引查询。

注意

  • 覆盖索引只返回索引中的字段,若需要更多字段则无法覆盖。
  • 可为常用查询专门设计复合索引以尽量实现覆盖。下一节介绍 MongoDB 查询分析