如何确定MongoDB中是否已完成完整的集合扫描

br3*_*3w5 11 indexing mongodb

我理解使用.explain()MongoDB查询的输出,您可以查看之间的区别n,nscanned以确定是否已执行完整集合扫描,或者是否已使用索引.文档陈述

您希望nnscanned尽可能接近价值.

Kyle Banker的优秀着作MongoDB in Action表示非常相似:

一般来说,你想要的值n,并nscanned以尽可能靠近在一起越好.在进行收集扫描时,几乎不会出现这种情况.

显然,这些陈述都不是关于比较n和确定的nscanned.差异的比例通常推断完整的收集扫描 - 10%,20%,30%+?有没有其他方法可以检查是否已完成完整的集合扫描?

Mat*_*att 25

上面的答案并不完全正确.

还将执行集合扫描,其中索引用于排序但不能辅助匹配条件.在这种情况下,扫描所有文档(按索引顺序)以查找与查找条件匹配的文档.另一种可能性是可能存在部分集合扫描,其中索引能够根据一个或多个查找条件缩小文档子集,但仍需要扫描该文档子集以查找完整查找条件的匹配.

在这些情况下,explain将显示正在使用的索引,而不是BasicCursor.因此,虽然BasicCursor在解释中的存在表明正在执行集合扫描,但是缺少它并不意味着没有执行集合扫描.

此外,使用--notablescan也无法帮助索引用于排序.因为查询仅引发未使用索引的异常.它不会查找索引是用于匹配还是排序.

确定是否执行集合扫描的唯一简单方法是将索引键与查询中的匹配条件进行比较.如果查询优化器选择的索引(并在解释中显示)不能回答查询匹配条件(即不同的字段),则需要进行收集扫描.

  • 您似乎只考虑排序与查找匹配的情况.如果您有一个仅支持排序的索引,并且您还与find匹配,则索引用于排序(索引运行以获取排序顺序)但仍然扫描/读取文档以执行比赛.以示例{a:1,b:1}的文档为例,其中索引为{a:1},但是db.test.find({b:1})的find语句.sort({a:1}) .当b上没有索引时,{a:1}索引用于排序,但仍然完整地扫描该集合. (3认同)
  • 作为观看者的旁注,对于遇到这篇文章的Mongo大学生来说,OP的问题只考虑了完整的集合扫描 - 有更多的查询可以使用索引并执行部分集合扫描,其中at为了完成查询,至少需要点击一个doc.因此,将索引键与匹配文档进行比较以查看所选索引是否能够回答您的查询或是否需要扫描某些文档非常重要. (2认同)

Sam*_*aye 7

差异的比例通常推断完整的收集扫描 - 10%,20%,30%+?

这是不可能的,但如果真的重要一吨,那么你可能会发现平均发现的性能下降高达200%; 是的,你会注意到它.它与此前面的任何其他数据库非常相似.

有没有其他方法可以检查是否已完成完整的集合扫描?

您可以使用一个标志来启动MongoDB,该标志告诉它永远不会进行全表扫描,在这种情况下,它会在尝试执行以下操作时抛出异常:http://docs.mongodb.org/manual/reference/mongod/#cmdoption- mongod的- notablescan

然而,最好的方法是在explain这里使用,您将知道查询何时不使用索引并被强制从磁盘或内存扫描整个集合.

  • @ssbrewster不然,不是,高性能使用索引是你需要确定的另一件事,使用索引和使用索引正确的方式是两个不同的东西 (2认同)
  • @ssbrewster更正了我上一次的陈述,因为我在第一次评论中说了两件事,我的意思是,因为以正确的方式使用索引仍然适用但答案也可能不是因为我的陈述不成立,如果索引仅用于排序然后是可以进行全表扫描. (2认同)