我试图对大约200,000个现有MySQL行进行批量更新。更具体地说,我需要在这些行中更新八个空的LONG BLOB字段,每个字段都有一个~0.5 Mb的文件(使用LONG BLOB是因为存在一些特殊情况,其中存储了大量文件;但是,这些不在此批量中考虑更新)。需要插入的文件存储在本地磁盘上。
我使用MATLAB脚本编写循环浏览存储这些文件的每个文件夹,读取文件并将其转换为十六进制表示,然后执行UPDATE查询以更新八个列每行的文件。
最初,事情进展得相当快;然而,我注意到经过几千次完成查询后,事情开始变慢。我做了一些关于优化MySQL和InnoDB系统变量的研究,并将innodb_buffer_pool_size
增加到25G,将innodb_buffer_pool_instances
增加到25。
经过这次修改后,事情再次加速,但又在经过几千次查询后放慢了速度。我做了一些更多的研究,并试图弄乱其他一些变量,例如innodb_log_buffer_size
和innodb_log_file_size
,将两者都增加到100M只是为了看看会发生什么。我还将innodb_write_io_threads
和innodb_read_io_threads
设置为16,因为我在具有32 GB RAM的相当高端的服务器上运行它。不幸的是,这些修改并没有多大帮助,现在我只是花了几分钟完成查询。
有没有人对如何优化此流程并让它尽可能快地运行有任何建议或想法?
谢谢,
乔
答案 0 :(得分: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远小于日志文件大小。