我有一个经常被我认为很慢的查询。它在我查询的每个数据点都有索引,但没有复合索引。
查询类似于:
ExternalLead.find({
'price': {$gte:3, $lt:6},
"campaign.id":"an id",
createdOn: {$gte: new Date(moment().subtract(10, 'days')),
$lte: new Date(moment().subtract(5, 'min'))
}}).limit(10).sort({_id:-1}).select('_id').exec(function(err, docs){
if (err) console.log(err);
var st = new Date();
console.log(st - s);
});
简单查询,该查询删除价格大约有50k条记录。价格被编入索引,我100%肯定。我已经通过多种方式验证了它。如果我删除价格,此查询将在大约200毫秒内完成,价格大约需要20秒。我测试了多个价格范围,它扫描的前10个应该匹配。这个查询有什么东西没有使用索引吗?
此外,服务器大约是此数据库现在需要的3倍,它不是服务器问题。整个数据库都加载到ram。
节点6.11.2, 猫鼬:4.10.8, mongodb-core:2.1.1 MongoDb:3.4
答案 0 :(得分:1)
原来我们需要一个价格的复合指数和createdOn。