我理解使用.explain()MongoDB查询的输出,您可以查看之间的区别n,nscanned以确定是否已执行完整集合扫描,或者是否已使用索引.文档陈述
您希望
n并nscanned尽可能接近价值.
Kyle Banker的优秀着作MongoDB in Action表示非常相似:
一般来说,你想要的值
n,并nscanned以尽可能靠近在一起越好.在进行收集扫描时,几乎不会出现这种情况.
显然,这些陈述都不是关于比较n和确定的nscanned.差异的比例通常推断完整的收集扫描 - 10%,20%,30%+?有没有其他方法可以检查是否已完成完整的集合扫描?
Mat*_*att 25
上面的答案并不完全正确.
还将执行集合扫描,其中索引用于排序但不能辅助匹配条件.在这种情况下,扫描所有文档(按索引顺序)以查找与查找条件匹配的文档.另一种可能性是可能存在部分集合扫描,其中索引能够根据一个或多个查找条件缩小文档子集,但仍需要扫描该文档子集以查找完整查找条件的匹配.
在这些情况下,explain将显示正在使用的索引,而不是BasicCursor.因此,虽然BasicCursor在解释中的存在表明正在执行集合扫描,但是缺少它并不意味着没有执行集合扫描.
此外,使用--notablescan也无法帮助索引用于排序.因为查询仅引发未使用索引的异常.它不会查找索引是用于匹配还是排序.
确定是否执行集合扫描的唯一简单方法是将索引键与查询中的匹配条件进行比较.如果查询优化器选择的索引(并在解释中显示)不能回答查询匹配条件(即不同的字段),则需要进行收集扫描.
差异的比例通常推断完整的收集扫描 - 10%,20%,30%+?
这是不可能的,但如果真的重要一吨,那么你可能会发现平均发现的性能下降高达200%; 是的,你会注意到它.它与此前面的任何其他数据库非常相似.
有没有其他方法可以检查是否已完成完整的集合扫描?
您可以使用一个标志来启动MongoDB,该标志告诉它永远不会进行全表扫描,在这种情况下,它会在尝试执行以下操作时抛出异常:http://docs.mongodb.org/manual/reference/mongod/#cmdoption- mongod的- notablescan
然而,最好的方法是在explain这里使用,您将知道查询何时不使用索引并被强制从磁盘或内存扫描整个集合.
| 归档时间: |
|
| 查看次数: |
8962 次 |
| 最近记录: |