mongoose find不同条件查询条件时间差别太大
发布于 7 年前 作者 lovegnep 3624 次浏览 来自 分享

向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多万条,第二种条件的没有。

8 回复

应该说明下 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

回到顶部