【问题标题】:A heavy query to mongodb hangs the website对 mongodb 的大量查询使网站挂起
【发布时间】:2016-12-28 09:28:19
【问题描述】:

我的网站(使用 MEAN.JS)有 1 个登录页面,还有多个统计页面(基于 db 数据构建的报告页面)。

有 1 份繁重的报告会从数据库中提取约 100MB,并且需要约 10 秒才能完成。问题是在运行此报告时,大多数其他网页都无法在浏览器上加载,因为它们也对 MongoDB 进行查询。例如,即使登录页面的UI已经显示,用户也无法在登录页面上登录。

MongoDB 是否能够并行执行多个查询或仅执行一个查询队列?

MongoDB 服务器版本为 v3.2.3。该报告使用 2 个集合:用户、跟踪位置。我正在构建一个月的报告:

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响应,但里面的数据表没有机会)。

【问题讨论】:

  • 你使用什么 mongo 版本?查询是否对报告和用户登录使用相同的集合?您使用什么类型的繁重查询?您还使用什么存储引擎?所有这些都很重要。
  • mongodb server v3.2.3,报告使用2个集合:users,trackinglocations;可能这会干扰许多其他查询。我在问题中添加了更多信息

标签: node.js mongodb performance nosql


【解决方案1】:

这种情况并不是 mongodb 独有的。是的,它可以并行运行查询,但是如果您启动一个特别大的报表,即使是其他具有更好并行化的数据库系统也会停止运行。

缓解这种情况的常用方法是在辅助/从属设备上运行繁重的查询(报告等)。这样一来,primary/master 不会受到影响,并继续提供写入和轻量级读取。

【讨论】:

    【解决方案2】:

    除了从secondary读取之外的另一个解决方案是多次从db读取,每次读取一小段文档,然后在每次读取操作后休息一下。

    //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);
                }
            });
        })();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2019-04-20
      • 2019-04-26
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多