簡體   English   中英

MongoDB聚合查詢運行非常慢

[英]MongoDB Aggregation query running very slow

我們在Mongodb中對大多數集合進行版本控制。 選定的版本控制機制如下:

{  "docId" : 174, "v" : 1,  "attr1": 165 }   /*version 1 */
{  "docId" : 174, "v" : 2,  "attr1": 165, "attr2": "A-1" } 
{  "docId" : 174, "v" : 3,  "attr1": 184, "attr2" : "A-1" }

因此,當我們執行查詢時,我們總是需要以這種方式使用聚合框架來確保獲取對象的最新版本:

db.docs.aggregate( [  
    {"$sort":{"docId":-1,"v":-1}},
    {"$group":{"_id":"$docId","doc":{"$first":"$$ROOT"}}}
    {"$match":{<query>}}
] );

這種方法的問題是,一旦完成分組,內存中就會有一組與集合無關的數據,因此無法使用索引。

因此,您的收藏集擁有的文檔越多,查詢速度就越慢。

有什么辦法可以加快速度嗎?

如果沒有,我將考慮轉到此好帖子中定義的方法之一: http : //www.askasya.com/post/trackversions/

為了解決這個問題,我們選擇了選項3:一個用於保留最新版本的集合,另一個用於保留歷史版本的集合。 它在這里介紹: http : //www.askasya.com/post/trackversions/ ,一些進一步的描述(帶有一些不錯的代碼片段)可以在http://www.askasya.com/post/revisitversions/找到

現在已經投入生產六個月了。 到現在為止還挺好。 前一種方法意味着我們總是使用聚合框架,只要您修改了原始模式(使用$ group,$ project ...),該框架就會從索引移開,因為它不再與原始集合匹配。 隨着數據的增長,這使我們的性能變得糟糕。

使用新方法雖然問題不復存在。 我們有90%的查詢都針對最新數據,這意味着我們將目標定位為以簡單的ObjectId作為標識符,並且我們不再需要聚合框架,只需常規查找即可。

我們對歷史數據的查詢始終包含idversion因此通過對它們進行索引(我們將它們都包含為_id使它們開箱即用),對這些集合的讀取也同樣快。 這一點雖然不容忽視。 在設計集合/方案在MongoDB中的外觀時,應用程序中的讀取模式至關重要。因此,在做出此類決定時,必須確保您了解它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM