簡體   English   中英

Mongodb查詢執行花費太多時間

[英]Mongodb query execution take too much time

我正在Go項目上工作,我正在使用mongodb存儲數據。 但是突然,mongodb查詢執行花費了太多時間來獲取數據。 我有一個名為“汽車”的集合,其中包含大約25000個文檔,每個文檔包含大約200個字段(4.385KB)。 我有這樣的匯總查詢:

db.cars.aggregate([
    {
        $lookup:
        {
            from: "users",
            localField: "uid",
            foreignField: "_id",
            as: "customer_info"
        }
    },{
        $unwind: "$customer_info"
    },{
        $lookup:
        {
            from: "user_addresses",
            localField: "uid",
            foreignField: "_id",
            as: "address"
        }
    },{
        $unwind: "$address"
    },{
    $lookup:
        {
            from: "models",
            localField: "_id",
            foreignField: "car_id",
            as: "model_info"
        }
    },{
    $match:{
        purchased_on:{$gt:1538392491}, 
        status:{$in:[1,2,3,4]}, 
        "customer_info.status":{$ne:9}, 
        "model_info.status":{$ne:9},
        }
    },{
        $sort:{
            arrival_time:1
        }
    },{
        $skip:0
    },{
        $limit:5
    }
])

我的文檔結構如下: https : //drive.google.com/file/d/1hM-lPwvE45_213rQDYaYuYYbt3LRTgF0/view

現在,如果運行此查詢而沒有建立索引,則大約需要10分鍾來加載數據。 誰能建議我如何減少執行時間?

有許多事情要做以優化您的查詢。 我會嘗試的:

  • 正如Anthony Winzlet在評論中所說,盡可能將$ match階段用作第一階段。 這樣,您可以減少傳遞到以下階段的文檔數量,並使用索引。

  • 假設您至少使用3.6版本的mongo,請使用'let / pipeline'語法更改查找階段( 請參見此處 )。 這樣,您可以在查找管道的$ match階段集成“外部過濾器”(“ customer_info.status”:{$ ne:9},“ model_info.status”:{$ ne:9})。 在正確的字段/集合上使用索引,您將在$ lookup階段獲得一些時間/內存。

  • 盡可能早地展開階段,以限制傳遞到以下階段的文檔數量。

了解聚合管道的工作方式非常重要:每個階段都接收數據,處理其工作並將數據傳遞到下一個階段。 因此,傳遞給管道的數據越少,查詢速度就越快。

暫無
暫無

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

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