0

假设我有一个 Mongo 集合,其中包含字段ab. 我已经用{a:'a', b : index }whereindex从 0 到 1000 迭代地增加了这个集合。

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

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

在此处输入图像描述

不过,以某种方式强制 Mongo 使用索引似乎可行:

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

在此处输入图像描述

编辑 Mongo 文档非常清楚,如果您的查询词之一与复合索引的第一个词匹配,它将仅使用复合索引。在这种情况下,使用提示,Mongo 似乎使用了复合索引{a:1,i:1},即使查询词不包括a. 这是真的?

4

1 回答 1

0

MongoDB 执行查询方式的有趣之处在于,它实际上可以并行运行多个查询以确定最佳计划。由于您在 shell 中进行的其他实验,或者即使您添加了数据以及它是否在内存中等/(或其他一些因素),它可能选择不使用索引。查看性能数字,它并没有报告使用该指数实际上比没有更快(尽管您通常不应该对这些数字进行太多评估)。在这种情况下,数据集真的很小。

但是,更重要的是,根据 MongoDB 文档,提示运行的输出还表明查询没有完全被索引 ( )覆盖indexOnly=false

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

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

仅供参考:使用详细选项查看为 find() 考虑的所有计划的报告。

于 2013-01-22T01:20:22.340 回答