2016-05-10 85 views
2

我在Nodejs中创建了一个应用程序,每分钟调用一个端点并获取一个具有大约100000个元素的json数组。我需要将这些元素插入到我的数据库中,以便如果元素不存在,则将列“Point”值设置为0来插入它。快速更新大量数据

到目前为止,我正在进行cron作业和简单的upsert查询。但它太慢了:

var q = async.queue(function (data, done) { 
    db.query('INSERT INTO stat(`user`, `user2`, `point`) '+data.values+' ON DUPLICATE KEY UPDATE point=point+ 10',function (err, result) { 
     if (err) throw err; 
    }); 

},100000); 

       //Cron job here Every 1 minute execute the lines below: 
       var values='' ; 
       for (var v=0;v<stats.length;v++) { 

         values = '("JACK","' + stats[v] + '", 0)'; 
         q.push({values: values}); 
       } 

我该如何在很短的时间内完成这样的任务。是使用mysql一个错误的决定?我接受任何其他架构或解决方案。请注意,我必须每分钟都做一次。

回答

0

我通过使用Bulk Upsert(从documentation)解决了此问题!我设法在不到3秒的时间内插入24k行。基本上先创建查询然后运行它:

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) 
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);