我正在从mysql迁移到mongodb。昨天开始学习mongodb。
我有一个很大的mysql表(超过400万行,每行超过300个字段),我正在移动到mongodb。
我们假设,products表包含以下字段 -
_id,类别和300多个其他字段。
要查找产品中的前5个类别及其计数,我有以下mysql查询
Select category, count(_id) as N from products group by category order by N DESC limit 5;
我在category
字段上有一个索引,此查询在mysql中大约需要 4.4秒。
现在,我已成功将此表格移至mongodb,这是我查找前5个类别及其计数的相应查询。
db.products.aggregate([{$group : {_id:"$category", N:{$sum:1}}},{$sort:{N: -1}},{$limit:5}]);
我再次在category
上有一个索引,但查询似乎没有使用它(解释:true表示如此),并且此查询也需要 13.5秒
在阅读了有关mongodb聚合管道优化的更多内容之后,我发现我们需要在聚合之前使用sort来使索引工作,但我在聚合的派生字段上进行排序,因此无法在聚合函数之前将其引入。 / p>
如何在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 :(得分:0)
目前在聚合框架可以用来改善我们用例的性能方面存在一些限制,但是,您应该能够通过首先对类别进行排序来加速查询。这将强制查询使用您添加的索引,并应加快管道第二部分中的组查询:
db.products.aggregate([
{ "$sort" : { "category" : 1 },
{$group : {_id:"$category",N:{$sum:1}}},
{$sort:{N: -1}},{$limit:5}]);