MySQL非常大的INSERT ... SELECT或应用程序级别批处理SELECT然后INSERTS

时间:2015-11-12 02:45:36

标签: mysql node.js

如果我要处理非常大量的数据(需要SELECT)然后插入另一个表(INSERT),那么这是一个更好的主意

  • INSERT ... SELECT语句,或可能是存储过程
  • OR应用程序级SELECT创建INSERT INTO table () VALUES (), (), ...
  • 批次的第一个流程

INSERT ... SELECT会挂起服务器吗?或者也许是内存不足?假设SELECT结果在一个大数据集中说100万条记录(但是数据很少,~2 +列.ID列所以它是INT)

更新:应用程序正在使用NodeJS

2 个答案:

答案 0 :(得分:1)

从性能角度来看,保持数据库中的所有数据处理通常是最佳解决方案。

处理一百万行应该没问题。当然,还有其他注意事项:例如索引和触发器。此外,如果插入阻止其他查询,那么这是另一个问题。但总的来说,select的一百万行应该没问题。

答案 1 :(得分:1)

我认为这个答案是戈登回应的附录。在第一个选项中,

  

INSERT ... SELECT语句,或可能是存储过程

整个操作都在数据库中进行,因此唯一的网络开销是发送查询本身,这可以忽略不计。但是,在第二个选项中,

  

应用程序级SELECT创建INSERT INTO table () VALUES (), (), ...

批次的第一个流程

您首先检索所有要插入应用程序层的数据,然后将所有数据发送回数据库。这里的网络开销远大于第一个选项。此外,应用程序层(例如Java)不擅长做数据库事务(但MySQL是)。处理应用层中的数据也可能容易出错。

如果可能的话,我会选择第一个选项。