使用提示()跳过复合索引的第一项

时间:2013-01-21 22:49:37

标签: mongodb

假设我有一个包含字段ab的Mongo集合。我已使用{a:'a', b : index }填充此集合,其中index从0到1000迭代地增加。

我知道这是非常非常错误的,但无法解释(没有双关语意)为什么:

collection.find({i:{$gt:500}}).explain()确认索引未被使用(我可以看到它扫描了集合中的所有1,000个文档)。

enter image description here

以某种方式强迫Mongo使用索引似乎可以工作:

collection.find({i:{$gt:500}}).hint({a:1,i:1}).explain()

enter image description here

修改 Mongo文档非常清楚,如果您的一个查询术语与复合索引的第一项匹配,它将仅使用复合索引。在这种情况下,使用提示,即使查询术语不包含{a:1,i:1},Mongo似乎也使用了复合索引a。这是真的吗?

1 个答案:

答案 0 :(得分:0)

关于MongoDB执行查询的方式的有趣部分是它实际上可以并行运行多个查询以确定什么是最佳计划。它可能已经选择不使用索引,因为您已经从shell中进行了其他实验,或者甚至在您添加数据以及它是否在内存中时等等(或其他一些因素)。查看性能数据,并没有报告使用索引的速度实际上比没有快(尽管通常不应该在这些数字中占用太多股票)。在这种情况下,数据集非常小。

但是,更重要的是,根据MongoDB文档,提示运行的输出也表明查询完全不是covered索引(indexOnly=false)。

这是因为您的索引是a:1, i:1,但查询是iCompound indexes仅支持基于索引字段的任何前缀的搜索(意味着它们必须按照指定的顺序)。

http://docs.mongodb.org/manual/core/read-operations/#query-optimization

仅供参考:使用verbose选项查看针对find()考虑的所有计划的报告。