node.js数据库批量插入vs插入一个tme

我是一个nodejs新手,并想知道哪种方式更好地插入数据库的大量的行。 从表面上看,插入东西看起来更像是要走的路,因为我可以快速释放事件循环并提供其他请求。 但是,代码看起来很难理解这种方式。 对于批量插入,我必须事先准备数据,这意味着使用循环肯定。 由于事件循环忙于循环,这将导致较less的请求在此期间被服务。

那么,最好的方法是什么? 我的分析是否正确?

这里没有正确的答案。 这取决于细节:为什么插入大量的行? 多久? 这只是一次性引导程序,或者您的应用程序每10秒钟执行一次? 这也关系到什么是可用的计算/ IO资源。 您的应用程序是使用数据库的唯一方法吗?或者正在使用对其他用户的拒绝服务请求进行爆破?

没有细节,我的经验法则是批量插入具有很小的并发限制,比如触发多达10个插入,然后等到其中一个完成后再发送另一个插入命令到数据库。 这遵循async.eachLimit的模型。 这就是浏览器如何处理给定网站的并发请求,并且已被certificate是合理的默认策略。

一般来说,内存中对象的循环应该快速,非常快。

我知道你担心阻塞CPU,但你应该考虑要完成的工作总量。 一次发送一个项目会带来很多开销。 对数据库的每个查询都有自己的内部for循环序列,可能会使您的“批处理” for循环看起来很小。

如果您需要在数据库中转储1000个事情,则可以执行的最小工作量是一次全部运行。 如果你做了10批次的100个“事情”,你必须做所有相同的工作,你必须产生和跟踪所有这些请求。

那么你多长时间一次做这些散装插页呢? 如果这是经常发生的情况,那么您可能希望尽量减less工作总量,并一次性批量插入所有内容。

这里的权衡是logging和重试。 只是执行某种types的批量插入并忘记它通常是不够的。 批量插入最终会失败( 完全或部分 ),您将需要一些types的逻辑来重试或合并。

如果这是一个问题,您可能需要pipe理批量插入的大小,以便您可以智能地重试块。