我正在从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聚合管道优化的内容之后,我发现我们需要在聚合之前使用排序才能使索引工作,但是我正在从聚合中对派生字段进行排序,所以不能将其放在聚合函数之前。
如何在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
}发布于 2016-01-20 13:57:51
目前,聚合框架在改进用例中的性能方面存在一些限制,但是,您应该能够首先对类别进行排序,从而加快查询的速度。这将迫使查询使用您添加的索引,并应加快管道第二部分中的组查询:
db.products.aggregate([
{ "$sort" : { "category" : 1 },
{$group : {_id:"$category",N:{$sum:1}}},
{$sort:{N: -1}},{$limit:5}]);https://stackoverflow.com/questions/34899210
复制相似问题