Node.js 对mongodb的大量查询将网站挂起
我的网站(使用MEAN.JS)有一个登录页面,还有多个统计页面(基于数据库中的数据构建的报告页面) 有一份繁重的报告将从数据库中提取约100MB的数据,需要约10秒才能完成。问题是,当运行此报告时,大多数其他网页也无法在浏览器上加载,因为它们也向MongoDB进行查询。例如,即使登录页面的UI已经显示,用户也不能在登录页面上登录 MongoDB能够并行执行多个查询,还是只执行一个查询队列 MongoDB服务器版本为v3.2.3。报告使用2个集合:用户、跟踪位置。我正在制作一个月的报告:Node.js 对mongodb的大量查询将网站挂起,node.js,mongodb,performance,nosql,Node.js,Mongodb,Performance,Nosql,我的网站(使用MEAN.JS)有一个登录页面,还有多个统计页面(基于数据库中的数据构建的报告页面) 有一份繁重的报告将从数据库中提取约100MB的数据,需要约10秒才能完成。问题是,当运行此报告时,大多数其他网页也无法在浏览器上加载,因为它们也向MongoDB进行查询。例如,即使登录页面的UI已经显示,用户也不能在登录页面上登录 MongoDB能够并行执行多个查询,还是只执行一个查询队列 MongoDB服务器版本为v3.2.3。报告使用2个集合:用户、跟踪位置。我正在制作一个月的报告: 30 d
30 days * 100 users * 10000 gps locations/day/user
= 30 million locations
user: {
username: (string),
organization: (objectid)
}
trackinglocation: {
username: (string),
date: (date),
locations: [
{
speed: (number),
long: (number),
lat: (number)
}
]
}
我首先查询以查找管理员组织中的那些用户。然后查询以生成该组织中用户在某个日期范围内的旅行距离报告
在制作报告的10秒钟内,不仅登录页面,许多其他页面都不响应浏览器(UI部分仍然由ExpressJS响应,但其中的数据表没有机会响应)。这种情况并非mongodb独有。是的,它可以并行运行查询,但即使是其他并行性更好的数据库系统,如果您启动一个特别大的报告,也会陷入停顿
缓解这种情况的一种常见方法是在辅助/从属服务器上运行大量查询(报告等)。这样,主/主系统就不会受到影响,并继续提供写操作和较轻的读取操作。除了从辅助系统读取之外,另一种解决方案是多次从数据库读取,每次读取一个较短的文档主干,然后在每次读取操作后稍作休息
//some lines below are pseudocode
function getLocs(callback) {
var idList = ...;
var index = 0;
var maxRead = 1000;
var results = [];
(function readATrunk(){
TrackingLocation.find({
id: {
$in: idList[index]...idList[min(index+maxRead,idList.length-1)]
}
}).
exec(function(error,trunk){
results = results.concat(trunk);
if (index+maxRead<idList.length) {
index += maxRead;
//give a spare 1 second for other queries in
//other web pages
setTimeout(readATrunk,1000);
}
else {
callback(results);
}
});
})();
}
//下面的一些行是伪代码
函数getLocs(回调){
var idList=。。。;
var指数=0;
var maxRead=1000;
var结果=[];
(函数readATrunk(){
TrackingLocation.find({
身份证:{
$in:idList[index]…idList[min(index+maxRead,idList.length-1)]
}
}).
exec(函数(错误,中继){
结果=结果。concat(主干);
如果(index+maxread您使用的mongo版本是什么?query在报表和用户登录时是否使用相同的集合?您使用的是什么类型的繁重查询?您使用的是什么存储引擎?所有这些都很重要。mongodb server v3.2.3版,报表使用了两个集合:用户、跟踪位置;这可能会干扰许多其他quries。我在中添加了更多信息问题