Appearance
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 查询分析。