Mybatis+mysql批量插入性能分析测试
前言
今天在网上看到一篇文章(后文中的文章指的就是它)
https://www.jianshu.com/p/cce617be9f9e
发现了一种有关于mybatis批量插入的新方法,而且看了文章发现我原来的方法好像有点问题,但是由于文章中使用的环境是sqlserver而我经常使用的是mysql所以还是需要亲自来试试。
环境说明
项目使用springboot mybatis
数据库mysql5.7
使用本地mysql所以网络可以忽略不计
插入对象完全相同,只有id自增
表结构如下:
CREATE TABLE order_test_tab (
id int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
order_id varchar(20) NOT NULL COMMENT '订单号',
order_name varchar(100) NOT NULL COMMENT '订单名称',
order_status int(1) NOT NULL COMMENT '订单状态',
order_content varchar(255) NOT NULL COMMENT '订单说明',
add_time datetime NOT NULL COMMENT '订单时间',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试订单表';
方法说明
我使用了和文章中提到的一样,三种方法进行测试
方法一:
使用for循环调用单条插入


方法二:
在sql中使用foreach进行批量insert

方法三:
使用mybatis的批量插入

结果说明
| 插入条数 | 100 | 500 | 1000 | 5000 | 100000 |
|---|---|---|---|---|---|
| 使用for循环插入 | 139ms | 545ms | 839ms | 2629ms | 31157ms |
| 使用sql foreach插入 | 55ms | 119ms | 123ms | 329ms | 报错 |
| 使用批量执行插入 | 48ms | 111ms | 239ms | 1081ms | 19235ms |
其中报错是因为sql长度过长超过了max_allowed_packet导致的,报错信息如下:
Error updating database. Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (22,700,108 > 4,194,304). You can change this value on the server by setting the 'max_allowed_packet' variable.
从结果我们显然可以看出,使用第二种方式(使用sql foreach插入)效率最高,明显与文章中差距很大,所以mysql和sqlserver还是有很大区别的,估计mysql针对批量插入的语句有过优化
测试说明
1.测试具体插入之前,首先执行删除表中所有数据操作,一个是保证环境完全一致,一个是为了减少第一次连接数据库所带来的性能消耗。
2.执行时间的计算就是在执行sql的前后,创建对象的时间不计算在这之内
3.在使用本地mysql测试完成之后,使用外网服务器的mysql进行测试,测试结果基本一致,时间都略有延长
4.测试代码在:https://github.com/LinkinStars/springBootTemplate/tree/test-batch-insert
其中包含order字样的为测试相关代码,别的是无关代码,入口在test包下的OrderTest.java
结论
批量插入时还是使用sql foreach插入来的效率最高,因为它是整一条sql在执行所以当插入条数很多的时候会出现异常,所以使用这种方式时一定要主动限制插入的最大条数,不然容易出现异常,因为max_allowed_packet即使再大也会有不够用的时候。
同时我们也应该竟可能去避免使用for循环插入数据,因为性能真的很差。
Mybatis+mysql批量插入性能分析测试的更多相关文章
- mybatis + mysql 批量插入、删除、更新
mybatis + mysql 批量插入.删除.更新 Student 表结构 批量插入 public int insertBatchStudent(List<Student> studen ...
- mybatis+mysql批量插入和批量更新、存在及更新
mybatis+mysql批量插入和批量更新 一.批量插入 批量插入数据使用的sql语句是: insert into table (字段一,字段二,字段三) values(xx,xx,xx),(oo, ...
- MySQL批量插入的分析以及注意事项
目录 1.背景 2.两种方式对比 2.1.一次插入一条数据 2.2.一次插入多条数据 3.拓展一下 4.Other 1.背景 我们在工作中基本都会碰到批量插入数据到DB的情况,这个时候我们就需要根据不 ...
- mybatis mysql 批量插入
场景描述: 使用mybatis操作mysql数据库,进行批量插入数据,提高代码质量和执行效率. 环境: mybatis spring mysql java xml配置文件 <insert id ...
- mybatis+mysql批量插入和批量更新
一.批量插入 批量插入数据使用的sql语句是: insert into table (字段一,字段二,字段三) values(xx,xx,xx),(oo,oo,oo) mybatis中mapper.x ...
- mysql基础---->mybatis的批量插入(一)
这里面记录一下使用mybatis处理mysql的批量插入的问题,测试有可能不准.只愿世间风景千般万般熙攘过后,字里行间,人我两忘,相对无言. mybatis的批量插入 我们的测试主体类是springb ...
- mybatis foreach批量插入数据:Oracle与MySQL区别
mybatis foreach批量插入数据:Oracle与MySQL不同点: 主要不同点在于foreach标签内separator属性的设置问题: separator设置为","分 ...
- mybatis oracle mysql 批量插入时的坑爹问题--需谨记
mybatis oracle mysql 批量插入一.oracle的批量插入方式insert into db(id, zgbh, shbzh) select '1', '2', '3' from du ...
- mysql批量插入语句执行失败的话,是部分失败还是全部失败
项目开发中,正好遇到这个问题. 将一批从外部第三方接口获取到的数据存储到本地mysql数据库,假设接口返回的数据类型为A,经过A到B的转换规则转换后, 要插入数据库的数据类型为B.那么在A获取到100 ...
随机推荐
- auth.go
), fmt.Errorf("invalid permission type: %s", s) } type authenticator struct { conn *gr ...
- 通过jenkins持续集成 github中的代码到 服务器。
前言 最近自己在探索springboot框架,了解到 jenkins 具有 自动我github 上带项目部署到 tomcat 中.于是决定先搭建一个jenkins 环境在继续研究. Jenkins简介 ...
- bzoj 3551 kruskal重构树dfs序上的主席树
强制在线 kruskal重构树,每两点间的最大边权即为其lca的点权. 倍增找,dfs序对应区间搞主席树 #include<cstdio> #include<cstring> ...
- AbstractQueuedSynchronizer AQS框架源码剖析
一.引子 Java.util.concurrent包都是Doug Lea写的,来混个眼熟 是的,就是他,提出了JSR166(Java Specification RequestsJava 规范提案), ...
- ruby整理
参考博客:https://www.cnblogs.com/felixzh/p/8081622.html 官网地址 https://rvm.io/rvm/install 一.前提 centos6.8下 ...
- YAML基础教程
一.YAML介绍YAML参考了其他多种语言,包括:XML.C语言.Python.Perl以及电子邮件格式RFC2822.Clark Evans在2001年5月在首次发表了这种语言,另外Ingy döt ...
- dubbo+zookeeper的使用
我们讨论过Nginx+tomcat组成的集群,这已经是非常灵活的集群技术,但是当我们的系统遇到更大的瓶颈,全部应用的单点服务器已经不能满足我们的需求,这时,我们要考虑另外一种,我们熟悉的内容,就是分布 ...
- 开源)嗨,Java,你可以生成金山词霸的二维码分享海报吗?
As long as you can still grab a breath, you fight.只要一息尚存,就不得不战. 有那么一段时间,我特别迷恋金山词霸的每日一句分享海报.因为不仅海报上的图 ...
- 基于滴答清单 Web 开发的 PC 客户端
基于滴答清单 Web 开发的 PC 客户端 关于「滴答清单」 滴答清单是一款不可多得的 GTD 效率工具,它有着清晰明了的界面设计.恰到好处的功能设置.稳定的同步服务,如果你还缺少一款简洁而有效的 G ...
- PHP学习笔记 01 之表单传值
一.HTML传值/PHP接收方法 1.GET(地址栏+问号+数据信息) (1)方式一:表单Form: method = 'get' GET接收数据方式: $_GET['表单元素name对应的值] (2 ...