我正在开发一个数据收集应用程序,它需要不断地插入mysql数据库。我使用python和pymysql来完成这个任务。我需要在主表中插入大约100行。python进程一直在运行,并保持与驻留在远程服务器上的mysql数据库的持续连接。
我知道,一般来说,最好将数据作为缓冲区(一次插入多行)插入,而不是单独插入。每隔大约100次插入一次提交(pymysql中的connection.commit())是否可以实现与一次插入大量数据相同的开销减少?
出于语法方面的原因,将行插入分离为单独的操作比较容易。
1条答案
按热度按时间cxfofazt1#
您应该发现,远程服务器的最大开销不是处理时间,而是每个查询发送到服务器并返回响应的往返时间。。。如果服务器的距离超过10毫秒,则不可能以100行/秒的速度单独插入,因为太多的时间浪费在线路上,等待。
有一些内部原因使批量插入或不频繁提交的性能更好,但当服务器距离较远时,它们的相关性就会越来越小。从您的Angular 来看,单个插入总是比批量插入慢,这仅仅是因为往返的次数。
在服务器本身,大容量插入传递了一个小的优势。。。在事务中,在每n次插入之后提交将传递一个小的优势。。。但是,使用这些策略在性能上的任何差异都会消失在远处连接的噪音中。
简而言之,在一个查询中插入多行而不是在多个查询中插入多行是唯一有意义的改进,因为服务器性能不是主要问题,而是距离。
当然,如果个别insert查询更可取,那么在程序中使用多个线程和到数据库的多个连接可能是提高性能的策略,因为n个连接可以并行执行n个查询,从而将往返时间t的实际净影响降低到t/n附近。