创建或更新数据时使用100%CPU的Sequelize / mysql

时间:2017-10-22 12:56:19

标签: mysql node.js sequelize.js

我需要使用sequelize从大型数组(少数1000个对象)更新或创建mysql表中的数据。

当我运行以下代码时,它几乎占用了我的数据库服务器(vserver 2gb ram / 2cpu)的所有cpu功能,并阻塞了我的应用程序几分钟,直到完成为止。

使用sequelize有更好的方法吗?这可以在后台以某种方式完成,也可以作为批量操作,因此它不会影响我的应用程序性能?

data.forEach(function(item) {           

    var query = {
        'itemId': item.id,
        'networkId': item.networkId
    };

    db.model.findOne({
        where: query
    }).then(function(storedItem) {
        try {
            if(!!storedItem) {
                storedItem.update(item);
            } else  {
                db.model.create(item);
            }
        } catch(e) {
            console.log(e);
        }
    });

});

2 个答案:

答案 0 :(得分:1)

您的示例代码data.forEach()...的第一行会对您的function(item){}进行一连串调用。反过来,你在该函数中的代码会异常地完成一系列异步操作。

尝试使用asynchttps://caolan.github.io/async/docs.htm并执行此操作

async = require('async');
...
async.mapSeries(data, function(item){...

它应该允许函数的每次迭代(在data数组中每个项目迭代一次)在开始下一个之前完成。矛盾的是,一次做一个可能会让他们更快完成。它肯定会避免吸收你的资源。

答案 1 :(得分:1)

几周之后我发现了这个的实际原因。 (不幸的是,使用async毕竟没有真正的帮助)它就像愚蠢一样简单:我没有itemId的MYSQL索引所以每次迭代都会查询整个表,导致高CPU负载(很明显)。