我有超过1,200,000个文档的收藏(tvshow剧集),
这是我的架构:
var episodeSchema = new Schema({
imdbId: { type : String },
showId: {type : String},
episodeId: { type : String },
episodeIdNumber:{ type : Number },
episodeTitle:{ type : String },
showTitle:{type : String},
seasonNumber:{type : Number},
episodeNumber:{type : Number},
airDate : {type : String},
summary:{type : String}
});
我为episodeTitle
episodeIdNumber
seasonNumber
episodeNumber
episodeId
和showId
现在我使用mongodb聚合组来获取每个电视剧剧集
这是我使用的聚合查询:
episode.aggregate( [
{ $match : { showId : "scorpion" } },
{$sort:{"episodeNumber":-1}},
{ $group: {
_id: "$seasonNumber", count: { $sum: 1 } ,
episodes : { $push: { episodeId : "$episodeId" , episodeTitle: "$episodeTitle" , episodeNumber: "$episodeNumber" , seasonNumber: "$seasonNumber" , airDate: "$airDate" } }
} }
,
{ $sort : { _id : -1 } }
] )
现在,当我运行此查询时,它需要超过2605.907 ms
,经过一些挖掘后我发现它为什么慢,这是因为使用了{$sort:{"episodeNumber":-1}}
,而没有使用{$sort:{"episodeNumber":-1}}
在19.178 ms
左右运行。
正如我上面提到的,我为episodeNumber
字段创建了一个索引并基于MongoDB Aggregation Pipeline Optimization
我在sort
之后使用match
所以基本上一切都很好,我没有任何错误。
所以在此之后我认为我的索引有问题,所以我删除了episodeNumber
索引并重新索引,但我没有同时改变。
最后一次,我尝试在没有episodeNumber
索引的情况下运行聚合组查询,令人惊讶的是它更快!它需要20.118 ms
。
我想知道为什么会发生这种情况,是不是索引能够获得更快的查询?
更新
查询解释输出:
{
"waitedMS" : NumberLong(0),
"stages" : [
{
"$cursor" : {
"query" : {
"showId" : "scorpion"
},
"sort" : {
"episodeNumber" : -1
},
"fields" : {
"airDate" : 1,
"episodeId" : 1,
"episodeNumber" : 1,
"episodeTitle" : 1,
"seasonNumber" : 1,
"_id" : 0
},
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.episodes",
"indexFilterSet" : false,
"parsedQuery" : {
"showId" : {
"$eq" : "scorpion"
}
},
"winningPlan" : {
"stage" : "EOF"
},
"rejectedPlans" : [ ]
}
}
},
{
"$group" : {
"_id" : "$seasonNumber",
"count" : {
"$sum" : {
"$const" : 1
}
},
"episodes" : {
"$push" : {
"episodeId" : "$episodeId",
"episodeTitle" : "$episodeTitle",
"episodeNumber" : "$episodeNumber",
"seasonNumber" : "$seasonNumber",
"airDate" : "$airDate"
}
}
}
},
{
"$sort" : {
"sortKey" : {
"_id" : -1
}
}
}
],
"ok" : 1
}