mongodb:如何查看聚合命令的执行时间?

ale*_*985 24 mongodb

我在mongo shell中执行follow mongodb命令

db.coll.aggregate(...)
Run Code Online (Sandbox Code Playgroud)

我看到了结果列表.但是有可能看到查询执行时间吗?聚合查询的解释方法是否有任何等效函数.

Dmi*_*kin 30

var before = new Date()
#aggregation query
var after = new Date()
execution_mills = after - before
Run Code Online (Sandbox Code Playgroud)

  • d =新日期; db.coll.aggregate(...); 打印(新日期 - d +'ms'),简洁明了. (14认同)
  • 不幸的是,这是最准确的 ATM 方式,但由于测量的是应用程序运行时间而不是数据库,因此它不如 OP 要求的那么准确。 (2认同)

ale*_*985 12

我看到在mongodb中有可能使用这两个命令:

  • db.setProfilingLevel(2)

  • 所以在查询之后你可以使用db.system.profile.find()来查看查询执行时间等

  • 一行示例:`db.system.profile.drop(); db.setProfilingLevel(2); db.collection.aggregate([<pipeline>]); db.setProfilingLevel(0); db.system.profile.findOne().millis` (2认同)

Luk*_*tor 10

您可以time.mongorc.js文件中添加一个函数(在您的主目录中):

function time(command) {
    const t1 = new Date();
    const result = command();
    const t2 = new Date();
    print("time: " + (t2 - t1) + "ms");
    return result; 
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

time(() => db.coll.aggregate(...))
Run Code Online (Sandbox Code Playgroud)

警告

该方法没有给出相关结果 db.collection.find()


Sam*_*aye 8

我会写一个答案来更好地解释这个.

基本上,聚合框架还没有explain()功能:https://jira.mongodb.org/browse/SERVER-4504

然而,有一种方法可以衡量客户端,但并非没有缺点:

  • 您没有测量数据库
  • 您正在测量应用程序
  • 关于部件之间有太多未知数,以便能够获得准确的读数,即你不能说由MongoDB服务器制定文件结果需要0.04ms,序列化,通过电线发送,de - 由应用程序进行序列化,然后存储到哈希中,允许您从总计中减去该总和以获得聚合基准.

不过话说回来,你可以通过在与mongos/ 相同的服务器上的MongoDB控制台中获得一个稍微准确的结果mongod.这将在两者之间创造很少,但仍然太多但足以获得你可以大致信任的阅读.因此,您可以在该位置使用@ Zagorulkin的答案.

  • 我想提一下,从2.6开始这个答案已经过时了,现在在aggregate()命令上有一个explain()权限 (3认同)

Dan*_*scu 7

或者你可以安装优秀的mongo-hacker,它会自动对每个查询进行pretty()计时,对其进行修改,对输出进行着色,对键进行排序等等:

在此输入图像描述

  • 不幸的是,这仅适用于find()命令,而不适用于aggregate(). (3认同)