在MySQL / PyMySQL中缓冲提交是否是一次插入多行的可行替代方案?

时间:2018-06-30 19:06:01

标签: python mysql pymysql

我正在开发一个数据收集应用程序,该应用程序涉及不断插入MySQL数据库中。我正在使用Python和PyMySQL完成此操作。我需要每秒在主表中插入约100行。 python进程一直在运行,并且与驻留在远程服务器上的MySQL数据库保持稳定的连接。

我知道,通常,最好将数据作为缓冲区插入(一次多行),而不是单独插入。每100次左右插入一次提交(在PyMySQL中为connection.commit())是否会实现与一次插入大量数据相同的开销减少?

出于语法原因,将行插入分成单独的操作更为容易。

1 个答案:

答案 0 :(得分:0)

应该发现远程服务器的最大开销不是处理时间,而是每个查询发送到服务器并返回响应的往返时间...如果服务器的距离大约超过10毫秒,因此不可能单独插入100行/秒,因为这浪费了太多的时间在等待。

有一些内部原因可以使批量插入或不频繁的提交执行得更好,但是当服务器距离更远时,这些相关性将变得越来越少。从您的角度来看,单个插入始终比散装插入慢,这仅仅是因为往返次数众多。

在服务器本身上,大容量插入会带来一个小的优势……在事务中,每执行 n 个插入后进行提交将带来一个小的优势……但同样,性能也会有所不同。使用这些策略会因遥远的连接而消失在噪音中。

简而言之,您可以做出的唯一有意义的改进就是在单个查询中插入多个行,而不是在多个查询中插入,因为服务器性能不是您的主要问题,而是距离。

当然,如果出于某些原因,更希望使用单个插入查询,则可以使用程序中的多个线程以及与数据库的多个连接来提高性能,因为 n 连接可以并行执行 n 个查询,从而将往返时间 t 的实际影响降低到 t / n附近