前言

今天在网上看到一篇文章(后文中的文章指的就是它)
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批量插入性能分析测试的更多相关文章

  1. mybatis + mysql 批量插入、删除、更新

    mybatis + mysql 批量插入.删除.更新 Student 表结构 批量插入 public int insertBatchStudent(List<Student> studen ...

  2. mybatis+mysql批量插入和批量更新、存在及更新

    mybatis+mysql批量插入和批量更新 一.批量插入 批量插入数据使用的sql语句是: insert into table (字段一,字段二,字段三) values(xx,xx,xx),(oo, ...

  3. MySQL批量插入的分析以及注意事项

    目录 1.背景 2.两种方式对比 2.1.一次插入一条数据 2.2.一次插入多条数据 3.拓展一下 4.Other 1.背景 我们在工作中基本都会碰到批量插入数据到DB的情况,这个时候我们就需要根据不 ...

  4. mybatis mysql 批量插入

    场景描述: 使用mybatis操作mysql数据库,进行批量插入数据,提高代码质量和执行效率. 环境: mybatis spring mysql java xml配置文件 <insert id ...

  5. mybatis+mysql批量插入和批量更新

    一.批量插入 批量插入数据使用的sql语句是: insert into table (字段一,字段二,字段三) values(xx,xx,xx),(oo,oo,oo) mybatis中mapper.x ...

  6. mysql基础---->mybatis的批量插入(一)

    这里面记录一下使用mybatis处理mysql的批量插入的问题,测试有可能不准.只愿世间风景千般万般熙攘过后,字里行间,人我两忘,相对无言. mybatis的批量插入 我们的测试主体类是springb ...

  7. mybatis foreach批量插入数据:Oracle与MySQL区别

    mybatis foreach批量插入数据:Oracle与MySQL不同点: 主要不同点在于foreach标签内separator属性的设置问题: separator设置为","分 ...

  8. mybatis oracle mysql 批量插入时的坑爹问题--需谨记

    mybatis oracle mysql 批量插入一.oracle的批量插入方式insert into db(id, zgbh, shbzh) select '1', '2', '3' from du ...

  9. mysql批量插入语句执行失败的话,是部分失败还是全部失败

    项目开发中,正好遇到这个问题. 将一批从外部第三方接口获取到的数据存储到本地mysql数据库,假设接口返回的数据类型为A,经过A到B的转换规则转换后, 要插入数据库的数据类型为B.那么在A获取到100 ...

随机推荐

  1. watch.go

    package: } ,) ), ), ) ) , ];]]] :] ].Err()]:] ].Kv.ModRevision         w.resuming = append(w.resumin ...

  2. BZOJ1854: [Scoi2010]游戏 二分图

    很早之前写的题了,发现没有更博,想了想,更一发出来. Orz ljss 这是冬令营上的例题...之后,我推出来了一种时间复杂度没有问题,空间复杂度没有问题的方法,额(⊙o⊙)…和给出的正解不同,但是能 ...

  3. 在openjdk8下看Unsafe源码

    尽管有传言JAVA9可能会移除Unsafe类,但不妨碍我们理解它的原理.因为类不在了,native方法还在那里.就像菜换样了,食材就那些没变.一个好厨师不仅仅需要会做菜,还需要能识别食材特性...来吧 ...

  4. Python 魔术方法笔记

    魔术方法总是被__包围, 如__init__ , __len__都是常见的魔术方法,这里主要写一下我遇到的一些魔术方法 setitem 对某个索引值赋值时 即可以进行赋值操作,如 def __seti ...

  5. 视频转字符动画-Python-60行代码

    更新:2018-5-21 注意: 最后一步播放字符动画使用了只支持类 unix 系统的模块 curses, 因此在windows上是播放不了的... 解决方法: 1. 最近好像有一个移植 https: ...

  6. 关于String类型中==和equals的区别。

    "=="操作符的作用 1.用于基本数据类型的比较,比较的是值. 2.用于比较对象,判断对象的引用是否指向堆内存的同一块地址. equals的作用 用于比较两个对象的内容是否相同 代 ...

  7. DB2数据库操作XMl字段

    1.xml查询语句 ① 查询xml中的单个节点内容 select TM_PRM_OBJECT.ORG , TM_PRM_OBJECT.PARAM_CLASS , TM_PRM_OBJECT.PARAM ...

  8. 【数学基础篇】---详解极限与微分学与Jensen 不等式

    一.前述 数学基础知识对机器学习还有深度学习的知识点理解尤为重要,本节主要讲解极限等相关知识. 二.极限 1.例子 当 x 趋于 0 的时候,sin(x) 与 tan(x) 都趋于 0. 但是哪一个趋 ...

  9. 改造MIP获得搜索青睐,轻松完成SEO

    搜索引擎目标及页面排序方法 搜索引擎作为互联网流量的入口,承担着流量分发的职责.但排序成千上万的网页,决定哪些网页在第一页,是由网页本身的用户体验决定的.权重算法会从内容优质性,广告多少,加载速度等多 ...

  10. WebGL展示3D房屋内景

      原文地址:WebGL展示3D房屋内景   由于生活和工作上的原因,从年前开始一直到处奔波,没有太多的时间去关注和学习WebGL图形学相关的技术, 不过陆陆续续都有学习使用blender进行3D建模 ...