最近在客户现场遇到一个向mysql 推送数据 非常非常慢的问题
我刚到客户现场,看到的是程序已经跑了一天零4个小时,我直接给杀掉了
其中有一张表的数据大概是900万左右,花了一个多小时,才推了25万左右的数据
经过优化900万的数据,花了大概8分钟左右
引起数据插入慢的原因可能有:程序上的问题,数据库的问题:主键(校验唯一性),索引(创建索引),锁表、数据库的一些配置的限制等等
一、在mysql的连接配置上 rewriteBatchedStatements=true
jdbc:mysql://X.X.X.X:3306/XXX?characterEncoding=UTF-8&rewriteBatchedStatements=true
意思就是把多个insert into X values() ,改为insert into X values(…),(…),(…)
这个配置加上之后,就提升到8分钟左右了,但是如果拼接的sql太长,要考虑修改max_allowed_packet配置
下面参数可适当修改,但是效果怎么样不知道!
二、修改mysql配置(这些配置不是越大越好)
(1)修改 bulk_insert_buffer_size
show VARIABLES like 'bulk_insert_buffer_size'
默认是8388608 / 1024 / 1024 = 8 可以调整为100 * 1024 * 1024 = 104857600
set global bulk_insert_buffer_size = 104857600
(2)修改 max_allowed_packet
show VARIABLES like 'max_allowed_packet'
*默认是4194304 / 1024 / 1024 = 4 可以调整为 20 * 1024 1024 = 20971520
set global max_allowed_packet = 20971520