Mongodb查询索引列中的所有值不使用索引

时间:2018-01-22 17:45:45

标签: mongodb indexing

我有一个集合,我经常想要为集合中的所有文档提取字段的值。具体来说,我想获取所有文档的“文件名”字段。我有一个关于这个领域的索引:

{ "v" : 2, "key" : { "filename" : 1.0 }, "name" : "filename_1", "ns" : "testdata.metadata" }

然而,当我搜索我的日志时,看起来它总是会使用COLLSCAN来返回我的结果:

command testdata.metadata command: find { find: "metadata", filter: {}, projection: { filename: 1.0 }, $db: "testdata" } planSummary: COLLSCAN 

如果我搜索特定文件名,它会使用索引。但如果尝试返回所有文件名,它不应该使用索引吗?如果mongo没有为此使用索引,有没有办法加快查询速度?这是一种常见搜索,在日志中经常显示为慢速搜索。

更新 这听起来像是this issue的副本。我尝试了那里发布的解决方案(设置internalQueryPlannerGenerateCoveredWholeIndexScans = 1),但据我所知,它没有帮助。进行更改后的“解释”仍然显示它正在进行collscan。

另一个问题解决方案的描述说该问题与执行空查询有关。所以为了测试,我尝试将空查询与{filename:{$ exists:1}}进行比较。果然,非空查询确实使用了索引,但结果并不快(根据解释)。这里需要注意的是,所有4个案例(查询空与非空,设置已启用与未启用)都比我日志中不时出现的情况快得多。该解释显示所有情况的执行时间约为200ms。但有时我的查询需要更长时间。事实上,在测试这个时,我得到了690000ms的结果!但后来又回到了200ms。

长话短说,我认为collscan与ixscan的问题是一个红色的鲱鱼。我想我还有别的事情要发生。

0 个答案:

没有答案