MySQL非常大的INSERT … SELECT或SELECT级别的批处理,然后是INSERTS

如果我有大量的数据要处理(需要一个SELECT),然后插入到另一个表(INSERT)中,哪个更好?

  • 一个长的INSERT ... SELECT语句,或潜在的存储过程
  • OR应用程序级别SELECT第一个进程创build批次的INSERT INTO table () VALUES (), (), ...

INSERT ... SELECT挂起服务器吗? 或者可能用完内存? 假设SELECT结果在一个大型的数据集中有一百万条logging(但是只有很less的数据,~2列,ID列,所以它是一个INT)

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

从性能angular度来看,保持数据库中的所有数据处理通常是最好的解决scheme。

处理一百万行应该没问题。 当然,还有其他的考虑因素:例如索引和触发器。 此外,如果插入阻止其他查询,比这是另一个问题。 但总的来说,从select一百万行应该没问题。

我认为这个答案是戈登答复的附录。 在第一种select中,

一个长的INSERT ... SELECT语句,或潜在的存储过程

整个操作发生在数据库中,所以唯一的networking开销就是发送查询本身,这是微不足道的。 但是,在第二种select中,

应用程序级别SELECT第一个进程创build批次的INSERT INTO table () VALUES (), (), ...

首先检索要插入应用程序层的所有数据,然后将其全部发送回数据库。 这里的networking开销远远大于第一种select。 另外,应用程序层(例如Java)在做数据库事情方面并不是很好(但是MySQL)。 处理应用层中的数据也可能是错误的。

所以如果可能的话,我会select第一个选项。