2017-08-16 110 views
0

我正在尝试执行大约200,000个现有MySQL行的批量更新。更具体地说,我需要更新这些行中的八个空LONG BLOB字段,每个字段都有一个〜0.5 Mb的文件(使用了LONG BLOB是因为存在一些特殊情况,其中存储了很大的文件;但是,在这个批量中不考虑这些更新)。需要插入的文件本地存储在磁盘上。优化大量更新现有MySQL数据的性能

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

最初,事情跑得相当快;但是,我注意到,在几千个完成查询之后,事情真的开始放缓。我做了优化的MySQL和InnoDB系统变量了一些研究,并增加了对innodb_buffer_pool_size 25G和innodb_buffer_pool_instances至25

此修改后,再次事情加快,但另一对夫妇一千条查询后放缓。我做了一些更多的研究,并试图解决一些其他变量,如innodb_log_buffer_sizeinnodb_log_file_size将两者都提高到100M,以查看会发生什么。我还将innodb_write_io_threadsinnodb_read_io_threads设置为16,因为我在32 GB RAM的相当高端的服务器上运行。不幸的是,这些修改并没有太大的帮助,现在我仍然坚持每个查询需要几分钟才能完成。

有没有人有任何建议或想法如何优化这个过程,并尽可能快地运行?

感谢,

+0

系统的吞吐量受到I/O操作(您硬盘的速度)的限制。它减慢通常是完全读/写缓存(包括可能已经缓存实际源文件的os缓存)的效果 - 但是最终*必须*写入磁盘。因此,请告诉我们硬盘速度,(更慢)更新速度以及数据源是否与数据库位于同一磁盘上,以估计速度是否太慢。你可以尝试的事情:确保你使用索引标识你的行(例如'update ... where id = 4',id主键)。定期承诺,但不在每行之后;尝试例如每100-500行。 – Solarflare

+0

嘿Solarflare的,我们使用一个RAID 5阵列的几个4 TB SAS 6 Gb/s的7200转服务器级的HDD构成总共约36 TB的存储空间中的。源文件与数据库确实在相同的存储空间中。将源文件移动到另一个存储空间会提高性能吗?另外,我使用主键索引来标识行。 – joekleespies

+0

系统规格没有多大帮助。将最大I/O(基准)与实际I/O进行比较。检查例如Windows的资源监视器或Linux的iotop/dstat。与此相比,你(慢)更新吞吐量(例如,如果你插入每秒5行,每行恰好8倍0.5MB,读,写为20MB /秒),以检查是否I/O的瓶颈。具有不同的驱动器上的源文件,提高写入速度(但如果不是,首先将它们复制都必须包含在执行时间)。也尝试提交频率。另外:也许只是将数据保存在文件系统/ smb共享中,而不是在数据库中。 – Solarflare

回答

0

innodb_buffer_pool_instances = 8将有可能成为开销更少您的要求。

innodb_log_buffer_size = 10M在写入innodb_log_file之前会'缓冲'在内存中已经累积10M之后。缓冲区的比率* 10 =日志文件大小是合理的。

当innodb_log_buffer_size与innodb_log_file_size相同时,您实际上没有缓冲。使buffer_size远小于日志文件大小。