【发布时间】:2013-03-27 20:30:32
【问题描述】:
参见下面的 shell 示例(假设 db.test 不存在):
db.test.ensureIndex({info: 1, _id: 1})
db.test.insert({info: "info1"})
db.test.insert({info: "info2"})
db.test.insert({info: "info3"})
db.test.find({info: "info1"}).explain().indexOnly //is false
db.test.find({info: "info1"}, {_id: 1, info: 1}).explain().indexOnly //is true
第一个explain 有indexOnly : false,而第二个有indexOnly : true,尽管这两个查询是严格等价的。
为什么不是db.test.find({info: "info1"}) a covered query?
【问题讨论】:
-
这很可能是 mongo 查询优化器的并发症,除非有投影,否则优化器不会检查覆盖的索引
-
补充一下,我会在jira.mongodb.org 上提交这个文件,因为看起来优化器应该在这里尝试使用覆盖查询,但显然优化器没有检测到这一点。
-
这显然既不是错误也不是怪癖。这两个查询以任何方式、形状或形式都不是“严格等价的”。他们在这个数据集上的结果恰好是“严格等价的”。但是查询本身是完全不同的。一个说“返回整个文档”,另一个说“从文档中返回这两个字段值”。
标签: mongodb indexing mongodb-query