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值,若数据出现问题,定位困难。

效率统计:

  1. 批量更新10条数据两种方法用时统计:

时间可以忽略不计;

  1. 批量更新100条数据两种方法用时统计:
  1. 批量更新1000条数据两种方法用时统计:
  1. 批量更新5000条数据两种方法用时统计:
  1. 批量更新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批量更新的两种方式效率试验<二>的更多相关文章

  1. mysql级联更新的两种方式:触发器更新和外键

    1.mysql级联更新有两种方式:触发器更新和外键更新. 2.触发器更新和外键更新的目的都是为了保证数据完整性. 我们通常有这样的需求:删除表Table 1中记录,需要同时删除其它表中与Table 1 ...

  2. Mysql批量更新的三种方式

    前言 批量插入由于mysql的VALUES原生支持,使用较为便利. 批量更新的写法一般有三种,在更新数量较少的情况下,前两种性能不相上下.但是在更新字段增加,更新条数较多(500以上)建议使用第三种写 ...

  3. c#mysql批量更新的两种方法

    总体而言update 更新上传速度还是慢. 1:  简单的insert  速度稍稍比MySqlDataAdapter慢一点 配合dapper 配置文件 <?xml version="1 ...

  4. mybatis学习之路----批量更新数据两种方法效率对比

    原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ...

  5. mybatis批量保存的两种方式(高效插入)

    知识点:mybatis中,批量保存的两种方式 1.使用mybatis foreach标签 2.mybatis ExecutorType.BATCH 参考博客:https://www.jb51.net/ ...

  6. mybatis中批量插入的两种方式(高效插入)

    MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用 ...

  7. mysql复制表的两种方式

    mysql复制表的两种方式. 第一.只复制表结构到新表 create table 新表 select * from 旧表 where 1=2 或者 create table 新表 like 旧表 第二 ...

  8. 自学Linux Shell9.4-基于Red Hat系统工具包存在两种方式之二:源码包

    点击返回 自学Linux命令行与Shell脚本之路 9.4-基于Red Hat系统工具包存在两种方式之二:源码包 本节主要介绍基于Red Had的系统(测试系统centos) 1. 工具包存在两种方式 ...

  9. Oracle并行更新的两种方式(merge/update内联视图)

    对于Oracle的两表联合更新的场景(有A.B两表,以A.id=B.id关联,根据B表中的记录更新A表中的相应字段),一般有update内联视图和merge两种方式,下面举例介绍:   创建用例表: ...

随机推荐

  1. TensorFlow保存和载入模型

    首先定义一个tf.train.Saver类: saver = tf.train.Saver(max_to_keep=1) 其中,max_to_keep参数设定只保存最后一个参数,默认值是5,即保存最后 ...

  2. emacs 集成astyle

    https://stackoverflow.com/questions/8115460/emacs-save-excursion-not-restoring-point https://github. ...

  3. spring+springmvc+ibatis整合注解方式实例

    需求说明 实现用户通过数据库验证登录需求.採用 Myeclipse+Tomcat 6.0+Mysql 5.0+JDK 1.6 2.数据库表 开发所用是Mysql数据库,仅仅建立单张用户表T_USER, ...

  4. centos mysql密码忘记了如何修改

    # /etc/init.d/mysql stop# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &# mysq ...

  5. 自建证书配置HTTPS服务器

    1.写这篇博客的初衷是因为最近iOS9出来了,苹果官方默认要求使用HTTPS,所以自己想整一个HTTPS服务器,也想好好了解一下HTTPS通信,也知道了HTTPS其实就是在HTTP的基础上加上了SSL ...

  6. VMVare 虚拟机使用桥接模式

    VMVare 虚拟机使用桥接模式,和物理机使用同一个物理网卡,和物理主机使用同一个段的ip. 1.VMware 编辑  > 虚拟网络编辑器 2.更改配置 3.编辑名称为VMnet0 的网络(如果 ...

  7. wps直接打开CVS文件会把长串数字订单号最后4位变为0

    WPS打开CVS文件,发现里面的长串数字订单号后4位全变成0了,而且是以科学计数法来显示了 上网查了下,不能直接打开,得先在WPS(OFFICE中也一样)中新建一个空白表格,然后用菜单里的数据导入功能 ...

  8. 解决Chrome 70版本以后谷歌不再信任赛门铁克证书问题

    Google 从 2018 年 10 月发布的 Chrome 70 就停止信任赛门铁克的旧证书了,而 Mozilla 也将在 10 月底发布 Firefox 63 时停止信任赛门铁克的旧证书. 导致大 ...

  9. spring-boot-actuator报错Full authentication is required to access this resource

    解决办法[设置端点访问 ]: 1, 关闭验证 management.security.enabled=false 2,开启HTTP basic认证 -  添加依赖 <dependency> ...

  10. hibernate 映射一对多

    参考笔记: https://www.cnblogs.com/biehongli/p/6561690.html