在我的Sails.js应用程序中,我有一个表auctions
,其中包含从Battle.net API开始的最后一次转储时收到的数据。
因此,每次realm
的新转储到达时,我都需要清除与此realm
关联的所有行,然后插入较新的行。
我可以这样做:
destroy()
发送单个查询,另一个使用转储本身); item
分组,然后destroy()
使用realm
和`项目的所有记录,然后插入新的记录。我目前正在使用async.forEachOfSeries
,如上所述的小批量,但使用当前负载(每次运行作业时插入45k记录),这是无法忍受的缓慢,并且没有考虑到如果我需要更新item
工具提示记录。
如果我试图一次性插入它们,Node.js会开始分页并挂起,或者MariaDB比Waterline允许的时间更长。
我怎样才能更可靠地处理这个问题? async.queue
或async.cargo
会有效吗?
答案 0 :(得分:1)
您要替换一个表中的所有行吗?这样做:
CREATE TABLE new LIKE real;
new
RENAME TABLE real TO old, new TO real;
DROP TABLE old;
它实现了零停机时间的交换。您无需担心LOAD的效率(步骤2)。
(我作为练习留给读者将这个MySQL / MariaDB代码翻译成sails.js或其他。)