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. SqlAlchemy “Too many connections”

    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\pymysql\connection ...

  2. HOWTO: Avizo/Amira使用前的显卡设置(Volume Rendering,Volren不显示)

    关于Avizo或Amira中体渲染不显示的问题,常常有人在问,有人甚至怀疑软件有问题,今天就这个话题总结如下: 首先我们要清楚像Avizo或Amira之类的三维可视化软件,必须是在配有专业显卡的工作站 ...

  3. Ubuntu安装WDCP遇到的无法便于错误解决方法

    WDCP v3.2安装 WDCP支持CentOS系统下安装,包括了32bit或者64bit,最新版本建议在6.x以上版本使用,源码安装命令为: wget http://dl.wdlinux.cn/la ...

  4. 小程序学习笔记二:页面文件详解之 .json文件

       页面配置文件—— pageName.json 每一个小程序页面可以使用.json文件来对本页面的窗口表现进行配置,页面中配置项会覆盖 app.json 的 window 中相同的配置项. 页面的 ...

  5. iostat各字段的来源和真实含义

    The primary tool for inspecting Linux disk performance is iostat. The output includes many important ...

  6. iOS ReplayKit实时录制屏幕实现方案的细节记录

    项目有个需求,需要把ios设备上的操作画面实时传输出去,也就是类似推流手机直播画面的方案. 一番调研后发现在ios中,我们可以通过ios自带ReplayKit框架实现. 关于ReplayKit的讲解, ...

  7. Git 将代码回到指定版本

    将代码回到hash为1fbcb7ea3b43df60c639875d2bb68e20b451059e的版本 git checkout 1fbcb7ea3b43df60c639875d2bb68e20b ...

  8. 存货控制中的ABC分类释义

    存货控制的ABC制度是根据存货的重要程度把存货归为A.B.C三类,最重要的是A类,最不重要的是C类. A类产品就是指在产品销售进程中,销量比较多,在库存管理方面需要大量备货的产品; B类则是销量适中, ...

  9. Python 爬虫实例(9)—— 搜索 爬取 淘宝

    # coding:utf- import json import redis import time import requests session = requests.session() impo ...

  10. python3 + flask + sqlalchemy +orm(2):数据库中添加表

    往数据库中添加一张保存文章的表,表明为article,字段有id,title,content 同样一个配置文件:config.py DEBUG = True #dialect+driver://roo ...