Java mysql 实现JDBC百万级数据插入

时间:2024-03-05 18:54:04

因为公司项目需要做一个excle快速导入到mysql功能,之前已经解决Java读取excle文件,但是因为文件有100w+的数据,插入mysql数据库很慢,1小时10w条,必须要做优化,后面写了批量插入1000条y一个批,但是速度还是很慢,查看数据库后发现mysql数据写入很慢,所以就对mysql数据做了写入优化,主要参考https://blog.csdn.net/qq_31065001/article/details/71519197

对一般情况下mysql上百万数据读取和插入更新是没什么问题了,但到了上千万级就会出现很慢,下面我们来看mysql千万级数据库插入速度和读取速度的调整记录吧。

 

 

(1)提高数据库插入性能中心思想:尽量将数据一次性写入到Data File和减少数据库的checkpoint 操作。这次修改了下面四个配置项: 
1)将 innodb_flush_log_at_trx_commit 配置设定为0;按过往经验设定为0,插入速度会有很大提高。

0: Write the log buffer to the log file and flush the log file every second, but do nothing at transaction commit. 
1:the log buffer is written out to the log file at each transaction commit and the flush to disk operation is performed on the log file 
2:the log buffer is written out to the file at each commit, but the flush to disk operation is not performed on it 
2)将 innodb_autoextend_increment 配置由于默认8M 调整到 128M

此配置项作用主要是当tablespace 空间已经满了后,需要MySQL系统需要自动扩展多少空间,每次tablespace 扩展都会让各个SQL 处于等待状态。增加自动扩展Size可以减少tablespace自动扩展次数。

3)将 innodb_log_buffer_size 配置由于默认1M 调整到 16M

此配置项作用设定innodb 数据库引擎写日志缓存区;将此缓存段增大可以减少数据库写数据文件次数。

4)将 innodb_log_file_size 配置由于默认 8M 调整到 128M

此配置项作用设定innodb 数据库引擎UNDO日志的大小;从而减少数据库checkpoint操作。

经过以上调整,系统插入速度由于原来10分钟几万条提升至1秒1W左右;注:以上参数调整,需要根据不同机器来进行实际调整。特别是 innodb_flush_log_at_trx_commit、innodb_log_buffer_size和 innodb_log_file_size 需要谨慎调整;因为涉及MySQL本身的容灾处理。

修改完之后发现插入速度又提升但是并没有达到帖子里说的10000/秒,看了下数据库数据  10000条数据确实是同时插入的,就打印了一下代码的执行时间,发现

pstm.executeBatch();
时间主要消耗在这里,然后根据https://blog.csdn.net/lgh1117/article/details/80212924这篇帖子对mysql连接串加上rewriteBatchedStatements=true参数,执行代码 插入51w数据只需要52s;OK;