我正在开发一个数据收集应用程序,它涉及到对MySQL数据库的常量插入。我正在使用Python和PyMySQL来完成这项工作。我需要每秒在主表中插入大约100行。python进程一直在运行,并维护与驻留在远程服务器上的MySQL数据库的持续连接。
我知道,一般来说,最好是以缓冲区的形式插入数据(一次插入多行),而不是单独插入。每100次左右的插入进行一次提交(PyMySQL中的connection.commit())是否可以实现与一次性插入大量数据相同的开销减少?
出于语法上的原因,将行插入分离到单独的操作中会更容易。
发布于 2018-07-01 09:14:30
您应该发现,远程服务器的最大开销不是处理时间,而是每个查询发送到服务器并返回响应的往返时间……如果服务器的距离超过10毫秒,则不可能单独插入100行/秒,因为等待在线路上浪费了太多时间。
有一些内部原因使得批量插入或不频繁的提交执行得更好,但当服务器距离更远时,这些原因变得越来越不重要。从您的角度来看,单个插入总是比批量插入慢,这仅仅是因为往返的次数。
在服务器本身,批量插入传递了一个小优势……在事务中,每n次插入后提交将传递一个小优势……但同样,使用这些策略在性能上的任何差异都将消失在远距离连接的噪声中。
简而言之,在单个查询中插入多行而不是多个查询是唯一有意义的改进,因为服务器性能不是您的主要问题--而是距离。
当然,如果有某些原因使单个insert查询更受欢迎,那么在程序中使用多线程和到数据库的多个连接是提高性能的一种可能策略,因为n个连接可以并行执行n个查询,从而将往返时间t的实际净影响降低到接近t/n的水平。
https://stackoverflow.com/questions/51117782
复制相似问题