mybatis批量新增和批量更新的效率对比
程序员文章站
2022-03-10 18:44:32
...
今天,为了更多了解下,mybatis批量新增和批量更新在simple/batch模式 + MySQL的rewriteBatchedStatements下效率有什么区别,做了一次实验。
实验结果,让人意想不到,如果没有亲自测试,可能一直会被网上帖子误导。
实验参数
-
mybatis的执行类型ExecutorType
- simply模式
- batch模式
-
形成的SQL语句方式
- insert:批量insert的SQL语句 , 样例:mybatis批量插入、批量更新和批量删除
- update(case when):case when拼写SQL语句 , 样例:批量更新数据两种方法效率对比
- update(foreach):mapper.xml中使用foreach, 样例:mybatis执行批量更新batch update 的方法
-
多少数据拼写成一条语句
- simply模式下:100条,一条SQL语句时提交 (这个可以自行调整)
- batch模式:100条, 每100条SQL语句时提交(这个可以自行调整)
-
Mysql参数rewriteBatchedStatements : true、false
- allowMultiQueries=true&rewriteBatchedStatements=true
- allowMultiQueries=true&rewriteBatchedStatements=false
实验结果:
运行结果是毫秒单位
实验结论:
- 批量insert时,当rewriteBatchedStatements=true,batch模式最快, 其他情况下simple模式和batch模式都差不多
- 批量update(case when) :simple模式和batch模式都差不多
批量update(foreach) 效率最慢,不可取 - 批量insert时,配合rewriteBatchedStatements=true,效率最好,对于批量update稍微有点影响,但是条件允许可以忽略不计
- 批量update(case when)时,无论rewriteBatchedStatements=true,simple模式和batch模式效率相差不太大,但是条件允许可以忽略不计
关于update(foreach)效率问题
先看这篇文章:mybatis学习之路----批量更新数据两种方法效率对比
我也对这个进行了实验,发现这个帖子有点误导人,原因如下:
-
这个帖子使用 or 方式 拼写条件, 因为使用or 不走索引的,会导致更新效率很慢,让人误导以为case when效率差。 可以参考:mysql关于or的索引问题
<foreach collection="list" separator="or" item="cus"> id = #{cus.id} </foreach>
-
如果使用in方式,批量更新效率会大大提高
sql.append("WHERE");
sql.append(" id IN ");
sql.append("<trim prefix=\"(\" suffix=\")\">");
sql.append("<foreach collection=\"list\" separator=\", \" item=\"i\" index=\"index\" >");
sql.append("#{i.id}");
sql.append("</foreach>");
sql.append("</trim>");
上一篇: java中的面向对象编程
下一篇: 关于验证码生成方法的汇总介绍