2016-01-20 69 views
0

我正在從mysql移動到mongodb。昨天開始學習mongodb。Mongodb:索引聚合排序限制查詢?

我有一個大的mysql表(超過400萬行,每個超過300個字段),我正在移動到mongodb。

假設,產品表有以下字段 -

_id,類等300多個領域。

要找到前5類的產品與他們的計數一起,我有以下MySQL查詢

Select category, count(_id) as N from products group by category order by N DESC limit 5; 

我對category場有一個指標,這個查詢大約需要4.4秒在MySQL的。

現在,我已成功地將此表移動到mongodb,並且這是我的相應查詢,用於查找其計數的前5個類別。

db.products.aggregate([{$group : {_id:"$category", N:{$sum:1}}},{$sort:{N: -1}},{$limit:5}]); 

我再次有指數category但查詢似乎並不使用它(解釋:真這麼說的),它也正在圍繞13.5秒此查詢。

在閱讀了關於mongodb聚合管道優化的更多信息之後,我發現我們需要在聚合之前使用排序來使索引工作,但我正在對聚合中的派生字段進行排序,因此無法在聚合函數之前進行。

如何在mongodb中優化像這樣的查詢?

============================================== ===========================的 輸出解釋

db.products.aggregate([{$group : {_id:"$category",N:{$sum:1}}},{$sort:{N: -1}},{$limit:5}], { explain: true }); 
{ 
     "waitedMS" : NumberLong(0), 
     "stages" : [ 
       { 
         "$cursor" : { 
           "query" : { 

          }, 
          "fields" : { 
            "category" : 1, 
            "_id" : 0 
          }, 
          "queryPlanner" : { 
            "plannerVersion" : 1, 
            "namespace" : "mydb.products", 
            "indexFilterSet" : false, 
            "parsedQuery" : { 
              "$and" : [ ] 
            }, 
            "winningPlan" : { 
              "stage" : "COLLSCAN", 
              "filter" : { 
                "$and" : [ ] 
              }, 
              "direction" : "forward" 
            }, 
            "rejectedPlans" : [ ] 
          } 
        } 
      }, 
      { 
        "$group" : { 
          "_id" : "$category", 
          "N" : { 
            "$sum" : { 
              "$const" : 1 
            } 
          } 
        } 
      }, 
      { 
        "$sort" : { 
          "sortKey" : { 
            "N" : -1 
          }, 
          "limit" : NumberLong(5) 
        } 
      } 
    ], 
    "ok" : 1 
} 
+0

你能後的'explain'查詢的輸出,請 – Jaco

+0

增加的產量解釋查詢。 – Aakash

回答

0

目前在什麼聚合框架一些限制可以爲了提高我們的用例的性能,但是,您應該能夠通過首先對類別進行排序來加快查詢速度。這將迫使查詢中使用已添加的指標,並應在管道的第二部分,加快組查詢:

db.products.aggregate([ 
    { "$sort" : { "category" : 1 }, 
    {$group : {_id:"$category",N:{$sum:1}}}, 
    {$sort:{N: -1}},{$limit:5}]); 
+0

是的,這已將執行時間縮短到7.9秒左右,並且正在使用類別上的索引。謝謝。 看起來像mysql更適合這種用例。 – Aakash