mysql批量更新的两种方式效率试验<二>
Mysql两种批量更新的对比
简介:
mysql搭载mybits框架批量更新有两种方式,一种是在xml中循环整个update语句,中间以‘;’隔开,还有一种是使用case when 变相实现批量更新,现就两种方法的效率做以对比。
两种写法:
方法一:整体循环update语句
注意:mysql默认不支持一条预编译sql以 ’; ’ 分割这种方式执行,需要在mysql 的jdbcUrl参数上追加 allowMultiQueries=true开启支持
SQL如下:
<!-- 批量更新表整体循环update语句-->
<update id="updateByForech" parameterType="java.util.List">
<foreach collection="list" item="item" >
update t_user
<set>
<if test="item.tName != null and item.tName != ''">
t_name = #{item.tName,jdbcType=VARCHAR},
</if>
<if test="item.tAge != null">
t_age = #{item.tAge},
</if>
<if test="item.tAddress != null">
t_address = #{item.tAddress,jdbcType=VARCHAR},
</if>
<if test="item.tPwd!= null">
t_pwd = #{item.tPwd,jdbcType=VARCHAR},
</if>
</set>
where t_id = #{item.tId};
</foreach>
</update>
该方法编写简单,便于理解,但是需要修改系统参数。
方法二:使用case when 方式拼接
SQL如下:
<!--caseWhen更新-->
<update id="updateByCaseWhen" parameterType="java.util.List">
update t_user
<trim prefix="set" suffixOverrides=",">
<trim prefix="t_name =case" suffix="end,">
<foreach collection="list" item="item">
<if test="item.tName !=null and item.tName != ''">
when t_id=#{item.tId} then #{item.tName,jdbcType=VARCHAR}
</if>
</foreach>
</trim>
<trim prefix="t_address =case" suffix="end,">
<foreach collection="list" item="item">
<if test="item.tAddress != null and item.tAddress != ''">
when t_id=#{item.tId} then #{item.tAddress,jdbcType=VARCHAR}
</if>
</foreach>
</trim>
<trim prefix="t_age =case" suffix="end,">
<foreach collection="list" item="item">
<if test="item.tAge != null">
when t_id=#{item.tId} then #{item.tAge}
</if>
</foreach>
</trim>
<trim prefix="t_pwd =case" suffix="end,">
<foreach collection="list" item="item">
<if test="item.tPwd != null">
when t_id=#{item.tId} then #{item.tPwd}
</if>
</foreach>
</trim>
</trim>
where t_id in
<foreach collection="list" item="item" separator="," open="(" close=")">
#{item.tId}
</foreach>
</update>
该方法sql 拼接复杂,为每一个要更新的字段罗列出id值,若数据出现问题,定位困难。
效率统计:
- 批量更新10条数据两种方法用时统计:
时间可以忽略不计;
- 批量更新100条数据两种方法用时统计:
- 批量更新1000条数据两种方法用时统计:
- 批量更新5000条数据两种方法用时统计:
- 批量更新10000条数据两种方法用时统计:
总结:
1.一次修改数据量较小的情况下, case when方式 和 整体更新方式 均可选择,但是整体更新需要新增系统参数配置
2.对于经常出现数据问题的,建议使用整体循环update方式,该方式生sql就是简单的update语句的拼接,便于定位问题。而case when方式 会在每一个需要修改的参数后面罗列出主键,切在mapper文件中出现大量冗余。
3.对于批量更新数据量很大的情况,case when效率低下,建议使用整体循环update。
该项目源码地址:https://git.lug.ustc.edu.cn/zhaiyt/demo7.git
mysql批量更新的两种方式效率试验<二>的更多相关文章
- mysql级联更新的两种方式:触发器更新和外键
1.mysql级联更新有两种方式:触发器更新和外键更新. 2.触发器更新和外键更新的目的都是为了保证数据完整性. 我们通常有这样的需求:删除表Table 1中记录,需要同时删除其它表中与Table 1 ...
- Mysql批量更新的三种方式
前言 批量插入由于mysql的VALUES原生支持,使用较为便利. 批量更新的写法一般有三种,在更新数量较少的情况下,前两种性能不相上下.但是在更新字段增加,更新条数较多(500以上)建议使用第三种写 ...
- c#mysql批量更新的两种方法
总体而言update 更新上传速度还是慢. 1: 简单的insert 速度稍稍比MySqlDataAdapter慢一点 配合dapper 配置文件 <?xml version="1 ...
- mybatis学习之路----批量更新数据两种方法效率对比
原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ...
- mybatis批量保存的两种方式(高效插入)
知识点:mybatis中,批量保存的两种方式 1.使用mybatis foreach标签 2.mybatis ExecutorType.BATCH 参考博客:https://www.jb51.net/ ...
- mybatis中批量插入的两种方式(高效插入)
MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用 ...
- mysql复制表的两种方式
mysql复制表的两种方式. 第一.只复制表结构到新表 create table 新表 select * from 旧表 where 1=2 或者 create table 新表 like 旧表 第二 ...
- 自学Linux Shell9.4-基于Red Hat系统工具包存在两种方式之二:源码包
点击返回 自学Linux命令行与Shell脚本之路 9.4-基于Red Hat系统工具包存在两种方式之二:源码包 本节主要介绍基于Red Had的系统(测试系统centos) 1. 工具包存在两种方式 ...
- Oracle并行更新的两种方式(merge/update内联视图)
对于Oracle的两表联合更新的场景(有A.B两表,以A.id=B.id关联,根据B表中的记录更新A表中的相应字段),一般有update内联视图和merge两种方式,下面举例介绍: 创建用例表: ...
随机推荐
- Gitbook 简介 使用总结 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- elementUI tree组件获取当前选择所有选中(check)和半选中(indeterminate)的节点
网上查了半天,一大堆都说要改源码的,最后发现有方法不用改源码的 获取方法如下 this.$refs.tree.getCheckedKeys().concat(this.$refs.tree.getHa ...
- [CSS] Useful CSS tool for Web designer and developer
1. Color Picker (Chrome) You might know how to use color picker in Chrome, recently there is a featu ...
- 【ASP.NET 问题】ASP.NET 网站404页面返回200,或者302的解决办法
做网站在优化网站时遇到了跳转404页面却返回 200.302状态的问题,这样的话搜索引擎会认为这个页面是一个正常的页面,但是这个页面实际是个错误页面,虽然对访问的用户而言,HTTP状态码是“404”还 ...
- 洛谷 P1739 表达式括号匹配
题目链接https://www.luogu.org/problemnew/show/P1739 题目描述 假设一个表达式有英文字母(小写).运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为 ...
- 在 System.Web.Mvc.DefaultModelBinder.ConvertProviderRe
在 System.Web.Mvc.ValueProviderResult.ConvertSimpleType(CultureInfo culture, Object value, Type desti ...
- 18.翻译系列:EF 6 Code-First 中的Seed Data(种子数据或原始测试数据)【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/seed-database-in-code-first.aspx EF 6 Code-F ...
- Android Studio打包程序时出现transformClassesWithDexForRelease错误
百度半天.没找到直接原因..国外网站上有写这个错误的..国内的真心没找到..英语水平有太低..实在没看懂怎么搞.. 后来发现clean项目的时候是提示如下错误: Information:Gradle ...
- 红米3 TWRP-3.2.1-0(android_7.1.2_r29) 刷8.1不提示错误 刷MIUI不再卡屏 修复无系统重启问题 更新于20180316
TWRP简介: TWRP是一个安卓平台很受欢迎的第三方REC,界面好看,功能强大. TWRP更新日志: 20180316更新: 1.使用最新android-7.1.2_r29分支源码适配. 2.更新版 ...
- ORACLE拼日期
Oracle数据库拼字符串是用"||"连接的.在开发中,经常会用到时间范围的查询 例如 startTime >='2017-05-22 00:00:00' and endT ...