网站首页 > 博客文章 正文
在使用MyBatis进行批量插入数据时,我们常用的方法是在使用insert语句进行批量插入,这种方式在数据量比较少的时候,插入较快,但是当数据量较大的时候,不仅耗时,而且占用的CPU资源比较高。今天我们来对比说明一下,并在最后给出优化的方案。
先设计一张MySQL数据库,用来存储批量插入的数据,以插入用户信息为例,本次表在设计时多设计一些字段,在插入时的差异凸显的更加明显。
接下来我以插入50000条数据为例,由浅入深,分别从循环单条插入、批量插入等进行对比分析。
1、循环单条插入
模拟生成用户的姓名、手机号、身份证号码这些信息,避免因相同数据造成的缓存误差,然后逐条插入数据库中。
随机生成用户姓名:
随机生成11位手机号码:
随机生成身份证号码:
逐条插入用户数据的实现方法(使用JUnit进行单元测试),需要了解JUnit进行单元测试,可以访问上一篇文章SpringBoot框架集成JUnit单元测试:
插入完毕,查看控制台总耗时,以及数据库的数据入库情况:
执行总共耗时1634240ms,也就是27分钟左右。
2、使用foreach批量插入
在同等条件下进行测试验证,还是自动生成用户信息,封装成list,然后一次性插入。
这种方式相对于第一种方式,进行了提升,原理就是将
转换为
此时我们去执行程序发现,程序报错
如果我们将批量插入的50000条数据改成10000条,发现1秒左右就执行结束了。
从上面可以看出,使用foreach进行批量插入,原理上就是让多条insert into插入语句变成一条插入语句,可以带来性能上的提升,但同时也带来了两个问题:
(1)当插入的数据较多时,相当于拼接的sql语句会特别的长,甚至超过sql语句的长度,一旦超出,就会抛出异常导致无法插入。
(2)当插入的数据较多时,也比较耗时,针对这点官方也做了说明,这里我们就不做详细的拓展,我们继续讨论怎么解决这个问题。这里贴一张官方的说明截图。
这句话要表达的意思就是,当插入数量很多时,不能一次性全放在一条语句里。
3、使用foreach配合分片批量插入
既然不能封装成一条SQL,那我们考虑有没有其他的方式,当然有,可以采用分片的方式。
主要原理就是将list集合按"指定长度"进行切分,返回新的List<List<类型>>集合。
可以看出,50000条数据,不到2秒钟就插入完成,大大提高了效率。
这里分片的目的有两个:
1、批量插入,拼接的SQL语句过长,sql语句会有限制;
2、分片后采用stream多线程并行插入可以提高效率;
此外,不管是mysql还是oracle数据库,都可以使用分片进行插入。
猜你喜欢
- 2024-12-26 Java 8 Stream 处理大数据集:实战与优化
- 2024-12-26 面试官:Java8 lambda 表达式 forEach 如何提前终止?
- 2024-12-26 Javascript中,forEach和map到底有什么区别?
- 2024-12-26 Excel VBA之For Each遍历循环的应用
- 2024-12-26 为什么建议使用 for…of 循环而不是 foreach 循环呢
- 2024-12-26 前端开发map和foreach区别,map遍历方式用法介绍
- 2024-12-26 Rust语言从入门到精通系列 - 零基础掌握Stream流迭代器
- 2024-12-26 Map遍历的四种方法效率对比
- 2024-12-26 java集合类之java中集合类有哪些?如何分类?
- 2024-12-26 【一分钟学Java】之List
你 发表评论:
欢迎- 最近发表
-
- Python 中 必须掌握的 20 个核心函数—len()函数
- 用PLC的指针实现字符串转byte(Codesys平台)一文极简搞懂指针
- EXCEL如何用函数读取复杂字符串中的数据
- 2025-07-19:计算字符串的镜像分数。用go语言,给定一个字符串 s
- 2025-07-10:字符相同的最短子字符串Ⅰ。用go语言,给定一个长度
- 基于物理特征融合与机器学习的多井协同钻井速率实时预测与优化(
- [电子学报文章精选]一种基于特征融合的恶意代码快速检测方法
- 强大的可视化流程图编辑神器 — LogicFlow
- 前端框架太卷了!字节企业级框架Arco Design Mobile开源了
- Vue独立组件——11个最佳Vue.js日期选择器组件
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- flutterrun (59)
- powershellfor (73)
- messagesource (71)
- plsql64位 (73)
- vueproxytable (64)
- npminstallsave (63)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- nacos启动失败 (64)
- ssh-add (70)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- qcombobox样式表 (68)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)