【发布时间】:2015-08-12 16:23:06
【问题描述】:
我正在使用 MongoDB 3.0.4,并且我有一个数据库,其中包含我想要聚合的数据。问题是,它需要的时间比它应该的要长。我做了功课(至少我猜),我看到了函数explain() 以及很多关于聚合和索引优化的技巧,但即便如此,我仍然怀疑。
最让我烦恼的是我无法在聚合光标上正确使用explain() 函数。当然,您可以直接将选项传递给聚合函数,但它不允许您更改详细程度。
我可以使用find().explain("executionStats")。有用。我还使用了强制聚合返回游标的选项。但是我无法以以下形式做任何事情:
db.coll.aggregate( ... { cursor : { batchSize : 0}}).explain("executionStats")
或
var a = db.coll.aggregate( ... { cursor : { batchSize : 0}})
a.explain("executionStats")
另一方面:
db.coll.explain("executionStats").aggregate( ... )
有效,但使用了错误的详细程度,我无法获得我想要的信息...
所以,实际的查询是:
db.pmsi.aggregate([
{ $match : { $GHM_Obtenu : { $in : ["040M51", "04M052"] } } },
{ $project : { "_id" : 0, "$GHM_Obtenu" : 1 } },
{ $group : {
_id : { "$GHM_Obtenu" },
count : { $sum : 1 } }
}
],{
cursor : { batchSize : 0 }
})
“GHM_Obtenu”字段中有一个索引供那些想知道的人使用。
无论如何,问题仍然存在:
有没有办法从聚合请求中获取executionStats?
感谢您抽出宝贵时间阅读我的问题,希望我没有遗漏一些太明显的问题。
干杯!
【问题讨论】:
-
我认为您在这里缺少的是查询执行计划中显示的相同“ms”响应并不真正适用于聚合管道。由于实际上是使用“相同的引擎”来执行此操作,因此真正可以查看的只是初始
$match阶段(其中存在一个)来确定该查询结果的效率。额外的管道阶段没有类似的“定时”,因为这与正常查询引擎的操作无关。虽然看到每个阶段的时间安排可能是“不错的”,但这样的事情还不存在。 -
@BlakesSeven 我明白你在说什么,但我不是在寻找执行时间的 executionStats,我担心内存使用情况,尤其是检查的文档数量。不过,谢谢你:)
-
因此,您只需使用
.find().explain()运行与您在初始$match中运行的基本查询相同的基本查询即可获得这些结果。这不是一个闲置的评论,我是在告诉你解释输出是什么。只是一个查询分析,与管道执行的其余部分无关。 -
但是如果我在 $first 上进行聚合和分组,理论上一个适当的索引至少允许不必检查所有文档并且整个聚合的 executionStats 是值得的。或者这对于 MongoDB 是不可能的?
标签: mongodb