向mongodb数据库中插入了112万条数据,model如下:
let testmodel = new mongoose.Schema({
updateTime:{type: Date, default: Date.now,},
f5Time:Date//刷新时间
});
testmodel.index({updateTime:-1,f5Time:1});//此处已经加了索引
let Testmodel = masterdb.model('Testmodel', testmodel);
分别用不同条件查询了两次
1. let s = Date.now();
Testmodel.find({"f5Time":{"$lte":new Date()}},{},{limit:5,sort:'-updateTime'},function(err,res){
if(err){
console.log(err);
}else{
console.log(‘长度:’,res.length);
}
let e = Date.now();
console.log('用时:',e-s);
})
//输出
5
用时: 63
2. let s = Date.now();
Testmodel.find({"f5Time":{"$gte":new Date()}},{},{limit:5,sort:'-updateTime'},function(err,res){
if(err){
console.log(err);
}else{
console.log(‘长度:’,res.length);
}
let e = Date.now();
console.log('用时:',e-s);
})
//输出
0
用时: 3063
为何两种查询条件用时差别那么大,已经对f5Time加了索引,测试了好几次,每次差别都很大,怎么优化呢? 满足第一种条件的文档数有100多万条,第二种条件的没有。
应该说明下 f5Time
字段有没有加索引
第一种取了前 5 条就返回了,第二种全表扫描一遍发现没有你要的值才返回的,所以时间长
@rrbe 加索引了,你没仔细看,如下
let testmodel = new mongoose.Schema({
updateTime:{type: Date, default: Date.now,},
f5Time:Date//刷新时间
});
testmodel.index({updateTime:-1,f5Time:1})
let Testmodel = masterdb.model('Testmodel', testmodel);
@rrbe 我也是这样想的,但是如果加了索引就不应该全表扫描了呀。
Sorry,没有仔细看。 可以了解下 mongo 查询的 explain,看看是不是走的索引扫描。 mongo-explain
因为你加的是个复合索引,但是是根据单字段排序和查找的,我暂时也不太清楚复合索引和单索引会不会有影响。所以可以先确认下是不是正确的走到索引查询了。
@rrbe 估计与这个有关系,我把那个复合索引删掉,重新弄了个单索引,查询速度就一样了。
复合索引,好像只能用,前面的索引查找. 也就是 Testmodel.find({“updateTime”:new Date()}) 或者 Testmodel.find({“updateTime”:new Date(),“f5Time”:new Date()}) 都可以使用符合索引.但是 Testmodel.find({“f5Time”:new Date()}}不行…没记错是这样的
@zhangxh1023 对的,看了文档,的确是这样
来自酷炫的 CNodeMD