2016-05-10 113 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);