请教一个关于mongo查询超时的问题
发布于 5 年前 作者 mofanjun 3230 次浏览 来自 问答

问题描述: 在游戏日志中删选出需要的数据并求和,日志数据量在300万+,我使用“一个连接实例”[mongoose.createConnection(url)]。 当前我要查询1个月的日志[相当于查询30个量级在300万+的集合],我将每个查询[查询一个集合,也就是一天]封装成promise,并使用 promise.all处理这30个查询。此时会出现客户端卡顿,甚至有时候出现"server responded with a status of 504 (Gateway Time-out)"" 代码片段:

/*
*@func:将查询封装成promise
*@param1:日期
*/
makePromise = function(day){
	//找到相应的模型
	var Model = newConnection.model(modelName,schema,'log'+day);
	//执行查询并获取返回的promise
	var query = Model.find(...).exec();
	//返回查询promise
	return query;
}

/*
*@func:查询之日数据库数据[日志数据库每天一个集合]
*@param1:开始时间
*@param2:结束时间
*/
findSth = function(from,to){
	//create a new connection
	var newConnection = mongoose.createConnection(url);
	//make query promise
	var promiseList = this.makePromise(day);//循环from...to创建Promise
	//exec
	Promise.all(promiseList)
		.then(...)//将查询数据返回给客户端
		.catch(...)//处理错误
}

我的问题: Q1:此时我创建了一个连接,看之前论坛的帖子 mongoose的问题,每次增删改查都要打开关闭时吗?。创建的连接会有poolSize,默认值是5.这个的意思是每个连接最多同时执行5条操作(find,update,remove)? Q2:如何改进服务端的代码,让耗时减少?创建多个连接实例是否是可行方案? Q3:如果我创建了一个连接C1,并把C1设置为null,而不是显式的断开,请问此时mongo是维持这个连接还是断开的?(TCP?) Q4:是否能基于我的问题提出一个合理的解决方案? 谢谢大家不吝赐教

2 回复

A1: 5表示有5个连接,每个连接可用来执行命令,可以理解为同时最多有5个连接去执行命令 A2: 线程池的大小,我觉得可以适当的放到20,5有点少 A3: 我猜测是维持这个连接,我具体没有试过,你可以通过mongostata工具来观察一下 A4: 先考虑下索引吧…上人觉得如果单个库超过300W数据,先在Mongo里查了下,看耗时多少,然后如果线程池有15的话,大概耗时 x * 2,理论上两次查完,再冗余一倍的时间?(猜的)…我觉得先要把单个库的查询先优化在100ms以内(猜的),通过加索引,不行就分个片试试,如果数据不要求实时性跑个中间表也行…

@Fov6363 感谢你的回答,受益匪浅。

回到顶部