2017-02-03 52 views
-1

我對具有40k文檔的集合進行了聚合查詢。需要很長時間的Mongo聚合查詢

{ aggregate: "REV_TABLE", pipeline: [ { $match: { r: { $lte: 1486066601 }, ISDI_ID: "17" } }, { $group: { _id: "$l", maxVer: { $max: "$r" } } } ] } 

我有兩個索引:{ 「R」:1}和{ 「R」:1, 「ISDI」:1}和背景索引是上。 最初當文件很小時,它曾經花費了< 100ms。 現在,因爲它大約35k +它需要超過300ms。

這是預期的,我猜35k不是那麼大,但爲什麼查詢花了這麼長時間才能回來。

+0

複合索引是否在'{「r」:1,「ISDI」:1}或'{「r」:1,「ISDI_ID」:1}?? –

回答

1

我建議看看Analyzing Query Performance in MongoDB的文檔。

您可以在其末尾運行查詢(例如db.collection.aggregate(yourQuery).explain('executionStats')),您將得到一個輸出,分析查詢各部分的性能,包括索引掃描的時間,正在使用的索引,等等。然後你可以採取措施來優化你的查詢。或者,如果沒有其他方法可以優化它,那麼您就會知道這只是因爲您要彙總大量文檔而造成的後果。

請記住,聚合通常也用於「管理員後端」和數據分析,而且由於聚合過程繁重,因此不常用於面向消費者的應用程序。聚合收集只需要很長時間。

您也可以讓MongoDB自動將緩慢查詢的查詢計劃轉儲到您的集合中(閱讀Database Profiling in MongoDB)。

例如,運行db.setProfilingLevel(1,20)會將超過20ms的任何操作的查詢計劃轉儲到名爲system.profile的集合中。