2013-04-23 44 views
5

我有一个MongoDB查询,我试图优化。我创建了一个与查询中的字段相匹配的索引,但我似乎无法让MongoDB的查询计划器在没有明确的hint()的情况下使用索引,即使nscannedmilli对于提示版本更好。为什么MongoDB不使用正确的索引?

这里有索引,查询(有和没有提示),以及一个详细的解释:

http://paste.roguecoders.com/p/4face5649612e840da04c5fea0491c9b.txt

信息的一个额外位:该指数是在一个大十岁上下的征收,一个副本集,所以我使用offline method构建索引。它现在存在于所有节点中。

(最初张贴上MongoDB-User。)

+0

如果您创建索引:'owner_1_date_-1_from_backup_1',该怎么办? – Sammaye 2013-04-23 19:49:02

+0

我的索引是对的。我正在排列'日期'。 (并且'hint()'确认它更好。)它还需要花费一个多小时才能将这个集合索引到我们的生产数据集中,所以我不愿意仅仅尝试没有很好理由的事情。 ( - : – scoates 2013-04-23 19:59:37

+2

这个链接可能解释你为什么得到'scanAndOrder' http://blog.mongolab.com/2012/06/cardinal-ins/它也可以解释为什么MongoDb没有看到你创建的索引为最佳 – Sammaye 2013-04-23 20:03:31

回答

3

这似乎是在2.4回归影响SERVER-5063修订当{$中:[]}中的值的一个条款是“空”。我将它作为新门票https://jira.mongodb.org/browse/SERVER-9495提交,我希望能尽快进行分类和修复。

同时,根据为什么存在空值(或缺少字段?)以及真/假,有几个选项,其中一些涉及更改查询,一些更改数据。我不会建议降级到2.2,但这也是一种可能性。