优化现有MySQL数据的批量更新性能

优化现有MySQL数据的批量更新性能,mysql,sql,matlab,performance,sql-update,Mysql,Sql,Matlab,Performance,Sql Update,我正在尝试对大约200000个现有MySQL行执行批量更新。更具体地说,我需要更新这些行中的八个空长BLOB字段,每个字段都有一个~0.5 Mb的文件(使用长BLOB是因为在某些特殊情况下存储了非常大的文件;但是,在这次批量更新中不考虑这些)。需要插入的文件存储在本地磁盘上 我正在使用我编写的一个MATLAB脚本,在存储这些文件的每个文件夹中循环,读取文件并将其转换为十六进制表示形式,然后执行更新查询,用每行的八个文件更新八列 起初,事情发展得相当快;然而,我注意到在完成了几千次查询之后,事情真

我正在尝试对大约200000个现有MySQL行执行批量更新。更具体地说,我需要更新这些行中的八个空长BLOB字段,每个字段都有一个~0.5 Mb的文件(使用长BLOB是因为在某些特殊情况下存储了非常大的文件;但是,在这次批量更新中不考虑这些)。需要插入的文件存储在本地磁盘上

我正在使用我编写的一个MATLAB脚本,在存储这些文件的每个文件夹中循环,读取文件并将其转换为十六进制表示形式,然后执行更新查询,用每行的八个文件更新八列

起初,事情发展得相当快;然而,我注意到在完成了几千次查询之后,事情真的开始变慢了。我做了一些关于优化MySQL和InnoDB系统变量的研究,将InnoDB_buffer_pool_size增加到25G,将InnoDB_buffer_pool_实例增加到25

在这次修改之后,事情又加快了,但在又进行了数千次查询之后,速度减慢了。我做了更多的研究,试图搞乱一些其他变量,比如
innodb\u log\u buffer\u size
innodb\u log\u file\u size
将两者都增加到100M,看看会发生什么。我还将
innodb_write_io_threads
innodb_read_io_threads
设置为16,因为我在一台具有32 GB RAM的高端服务器上运行这一切。不幸的是,这些修改并没有多大帮助,现在我只能用几分钟完成每个查询

是否有人对我如何优化此流程并使其尽可能快地运行有任何建议或想法

谢谢


Joe

innodb\u buffer\u pool\u instances=8可能会以更少的开销满足您的需求

innodb_log_buffer_size=10M将在内存中累积10M后写入innodb_log_文件之前进行“缓冲”。缓冲区*10=日志文件大小的比率是合理的


当innodb_log_buffer_大小与innodb_log_file_大小相同时,实际上没有缓冲。使缓冲区大小远小于日志文件大小。

innodb\u buffer\u pool\u instances=8可能会以更少的开销满足您的需求

innodb_log_buffer_size=10M将在内存中累积10M后写入innodb_log_文件之前进行“缓冲”。缓冲区*10=日志文件大小的比率是合理的


当innodb_log_buffer_大小与innodb_log_file_大小相同时,实际上没有缓冲。使缓冲区大小远小于日志文件大小。

系统的吞吐量受i/o操作(硬盘的速度)的限制。它的速度减慢通常是完全读/写缓存(包括可能缓存了实际源文件的操作系统缓存)的影响,但最终必须写入磁盘。因此,请告诉我们硬盘速度,更新速度(较慢),以及源是否与数据库位于同一磁盘上,以估计是否太慢。您可以尝试的事情:确保使用索引标识行(例如
update…其中id=4
,id主键)。定期提交,但不要在每行之后提交;例如,每100-500行尝试一次。嘿,Solarflare,我们使用一个RAID 5阵列,由两个4 TB SAS 6 Gb/s 7200 RPM服务器级硬盘组成,总共约占36 TB的存储空间。源文件确实与数据库位于同一存储空间中。将源文件移动到另一个存储空间会提高性能吗?此外,我还使用主键索引标识行。系统规范没有多大帮助。将最大i/o(基准)与实际i/o进行比较。例如,检查windows的资源监视器或linux的iotop/dstat。将其与(较慢的)更新吞吐量进行比较(例如,如果每秒插入5行,每行正好是0.5mb的8倍,则读写速度为20mb/s),以检查i/o是否是瓶颈。将源文件放在不同的驱动器上可以提高写入速度(但如果不是,则必须在执行时间中首先复制它们)。还可以尝试提交频率。另外:可能只是将数据保存在文件系统/smb共享中,而不是数据库中。感谢@Solarflare提供的所有帮助。我想我发现了问题所在。在启动脚本之前,我删除了除主键之外的所有索引,因为我认为它们会对性能产生负面影响。我之前说我是通过主键识别更新查询中的行,这是错误的。实际上,我是通过从中删除索引的第二列来标识行的。运行
显示引擎INNODB状态后
我看到大约300秒。正在为更新查询提取行。我为本专栏重新添加了索引,从那以后,速度提高了很多。系统的吞吐量受到I/o操作(硬盘的速度)的限制。它的速度减慢通常是完全读/写缓存(包括可能缓存了实际源文件的操作系统缓存)的影响,但最终必须写入磁盘。因此,请告诉我们硬盘速度,更新速度(较慢),以及源是否与数据库位于同一磁盘上,以估计是否太慢。您可以尝试的事情:确保使用索引标识行(例如
update…其中id=4
,id主键)。定期提交,但不要在每行之后提交;例如,每100-500行尝试一次。嘿,Solarflare,我们使用一个RAID 5阵列,由两个4 TB SAS 6 Gb/s 7200 RPM服务器级硬盘组成,总共约占36 TB的存储空间。源文件确实与数据库位于同一存储空间中。将源文件移动到另一个存储空间会提高性能吗?此外,我还使用主键索引标识行。系统规范没有多大帮助。将最大i/o(基准)与实际i/o进行比较。例如,检查windows的资源监视器或linux的iotop/dstat。将其与(较慢的)更新吞吐量(例如