簡體   English   中英

NodeJS MongoDB查詢執行緩慢

[英]NodeJS MongoDB Query slow to execute

我正在使用以下查詢(使用NodeJS適配器)來查找集合中缺少的索引。

findIndexGaps(collection, index, from, to, callback) {
    var aggregateOptions = [
        { $group: {_id: null, min: {$min: from}, max: {$max: to} } },
        { $addFields: {rangeIds: {$range: ['$min', '$max'] } } },
        { $lookup: {from: collection, localField: 'rangeIds', foreignField: index, as: 'entries'} },
        { $project: {_id: 0, missingIds: { $setDifference: ['$rangeIds', '$entries.'+index]}}}
    ];

    this.connection.collection(collection).aggregate(aggregateOptions, {allowDiskUse: true}).toArray(...);
}

我已經為集合設置了唯一的索引item_id 當我使用參數from = 0 to = 50 ,並且索引='item_id'時,查詢返回正確的結果。 但是,執行將花費近9秒鍾的時間,這對於最多返回50個結果的查詢來說是不可接受的。

我要查詢的集合非常大。 在撰寫本文時,它包含約4200萬個條目,並且每月增長約1000萬。 我可以使用較小的查詢范圍(如以上示例中使用的50),但是我希望這些查詢盡可能高效。

是什么導致這種速度下降,我該如何優化呢?

我發現減速的原因是因為在分組之前沒有包括$match運算符,因此它將加載我的整個數據集,然后進行分組,然后搜索間隙。

這是我用來解決問題的選項:

//In aggregateOptions[]:
{ $match: { [index]: { $lte: to, $gte: from } } }

但是,執行將花費近9秒鍾的時間,這對於最多返回50個結果的查詢來說是不可接受的。

查詢的性能不依賴於返回多少結果。 它取決於生成結果的工作量以及執行工作時可用的資源量。

全面診斷性能將需要更多信息,但是我懷疑操作很慢,因為$ group階段正在掃描集合中的所有4200萬份文檔並匯總結果。 考慮添加一個初步的$ match階段以過濾出不需要聚合的數據。

您還應該確保在兩個集合上都為$ lookup階段查詢建立索引(例如,在源集合上索引“ rangeIds”,以及在外部集合上建立索引字段)。

請與您的平台支持團隊或文檔核對-集合可以處理的最佳條目數。 在我看來,這聽起來像是一個大數據案例。 我認為MongoDB可能不支持十萬個條目以外的任何內容-我猜對於如此龐大的數據量,您可能需要更快,更高級的數據庫產品。

暫無
暫無

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

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