MySQL批量插入优化分享

2024年 1月 29日 83.3k 0

点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!  

背 景

数据库的批量插入优化是提高数据处理效率和性能的重要手段之一。在实际项目中,批量插入大量数据的情况非常常见。在这些场景下,如何快速、有效地将数据插入到数据库中,同时保证系统的稳定性和性能,是一个需要解决的问题。

传统的数据库插入方式是采用单条插入语句,每次插入一条数据。这种方式在处理大量数据时,会引发很多问题。比如,随着插入数据的增多,SQL语句的执行时间会逐渐增长,甚至可能超过数据库的最大连接数,导致系统崩溃。此外,大量的SQL语句执行会消耗大量的系统资源,如CPU和内存,这也会影响系统的性能和稳定性。为了解决这些问题,我们可以使用批量插入技术。批量插入是指一次性向数据库中插入多条数据,而不是一条一条地插入。这种方式可以大大减少SQL语句的执行次数,提高数据插入的速度和效率。同时,由于减少了数据库的交互次数,也降低了数据库服务器的负载,有利于提高系统的稳定性和性能。在Java中,我们可以使用JDBC、MyBatis和MyBatis Plus等来进行批量插入操作。这些框架提供了丰富的API和插件,可以很方便地实现批量插入的功能。下面通过测试不同方式对MySQL数据库的批量插入来了解实现及优化过程。

环境准备

MySQL数据库版本:5.7.25

测试表:MySQL驱动:

批量插入测试

3.1 JDBC普通插入

在开始实现批量插入之前,为了直观地对比普通插入方式和批量插入方式的差异,我们先编写一个使用JDBC循环插入一万条记录的程序,并记录下插入所需的时间。下面是主要代码:执行完毕,JDBC普通for循环方式插入一万条数据耗时约108秒,可以看到这个效率还是挺低的。

3.2 JDBC批处理插入

对上述方式做一下改造:

  • 在MySQL连接串URL中添加rewriteBatchedStatements=true。这个设置允许重写批量提交,如果不开启,executeBatch()方法会被无视,导致原本应该批量执行的SQL语句被拆分成单条执行。
  • 通过setAutoCommit(false)将事务修改为手动提交,同时将执行方法改为批处理方式executeBatch();此处同时加入了分片处理,可以避免因一次性提交大量数据而导致的数据库性能问题和内存占用过高问题。

通过使用批处理方式优化后,可以看到执行时间明显降低,插入一万条数据只需要1.2s左右。

3.3 Mybatis批处理插入

在日常工作中,大部分情况下使用的是Mybatis或者Mybatis Plus框架,接下来测试在框架中使用批处理插入的效率。先看看Mybatis实现JDBC批处理,主要代码如下:执行耗时1.2s左右,与JDBC批处理耗时相当,可见两种方式操作区别不大。

3.4 Mybatis foreach动态拼接sql插入

再看下在Mybatis的xml中通过foreach动态拼接sql方式插入,下面是一些主要代码:可以看到执行时间不到1s,与JDBC批处理效率相当,甚至要更高一点。但是这种方式有个弊端,由于没有分片操作,当处理的数据量更大(例如达到10万条时),测试结果会出现错误,这是因为MySQL默认的最大可执行SQL语句大小为4MB,而我们使用动态SQL拼接后的语句大小大于了这个默认值。虽然可以通过修改MySQL的默认sql大小(max_allowed_packet)来解决,但这并不是最好的解决方案。因为将max_allowed_packet参数设置得过大可能会导致其他问题,例如,它可能会导致MySQL服务器内存不足,从而影响整体性能。

3.5 Mybatis Plus 批处理插入

Mybatis Plus也是一个当前流行的Mybatis增强工具,我们看看它自带的批处理插入方法如何,下面是主要实现代码:Mybatis Plus提供了一个saveBatch()方法实现批处理保存,默认分片操作大小是1000。执行时间接近1s,与上述方式时间相近,实际查看saveBatch()底层源码也能看出,实现逻辑与上述Mybatis批处理类似。与上述方式相比,Mybatis Plus调用十分简单。

总 结:

通过上述测试,可以得到以下结论:

  • 在做批量插入操作时,优先考虑批处理方式。
  • 在数据量不大的批量插入情况下,可以考虑JDBC普通插入或者Mybatis动态拼接sql插入方式,推荐使用后者,性能效率更高。
  • 原生JDBC和Mybatis框架下的批处理插入效率相当。JDBC方式实现简单,MyBatis则提供了一个抽象层来管理数据库操作,并允许使用更高级的特性来优化性能。选择哪个应该基于项目需求、团队技能和对性能的具体要求。
  • 如果项目中使用了Mybatis Plus框架,推荐使用其提供的批处理方法,可以在保证高效性能和低资源消耗的前提下,大大简化代码量。

在实际应用中,我们需要根据具体的业务场景和系统环境,选择合适的批量插入技术和框架,同时注意处理可能出现的各种问题。
END

本文作者:孙涛涛(上海新炬中北团队)

本文来源:“IT那活儿”公众号

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论