【问题标题】:Mongo - How to explain query without executing itMongo - 如何在不执行查询的情况下解释查询
【发布时间】:2018-01-06 08:40:46
【问题描述】:

我是 Mongo 的新手,已经搜索过但没有看到具体的答案。

我了解Mongo explain method 将与可能的访问计划并行执行查询,并根据执行时间选择获胜计划。

最佳实践指南指出“无需先运行查询即可计算和返回查询计划”。 我在文档中找不到如何执行此操作。

那么,如果即使是获胜计划也需要很长时间才能返回一个小的结果集,例如对一个大集合进行排序,该怎么办?

我看到旧的 cmets 在返回前 101 个文档后停止执行,但在官方文档中再次找不到。

所以我的问题是:如何在不执行查询的情况下获取访问计划?

感谢您的帮助。我正在使用 Mongo 3.4。

【问题讨论】:

    标签: mongodb explain


    【解决方案1】:

    您可以设置explain() 函数的详细程度。默认情况下,它使用queryPlanner,这是(如果我是对的)您正在寻找的。

    查看official MongoDB documentation about explain()中的其他模式

    【讨论】:

    • 谢谢。我阅读了 queryPlanner 文档,但并不清楚,因为它声明它不返回执行结果,但这并不明确意味着查询没有执行,只是没有返回结果。我相信你是对的。
    【解决方案2】:

    MongoDB 通过运行查询的有限子集来构建Query Plans,然后缓存获胜的计划以便可以重复使用(直到某些原因导致缓存刷新)。

    所以“有限子集”意味着它将获取与 100 个文档匹配的文档作为“样本”,不再赘述,而是文档的含义

    可以计算并返回查询计划,而无需先 运行查询

    是您可以在运行完整查询之前进行解释。这是一种很好的做法,因为它会提前为您填充计划缓存。

    简单地说,如果 MongoDB 注意到另一个查询比完成的查询花费的时间更长,它将停止执行并放弃计划以支持更有效的计划。例如,您可以通过运行 allPlansExecution 来解释在哪里选择索引而不是 colscan。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      相关资源
      最近更新 更多