我正在從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
}
你能後的'explain'查詢的輸出,請 – Jaco
增加的產量解釋查詢。 – Aakash