前言

批量插入由于mysql的VALUES原生支持,使用较为便利。

批量更新的写法一般有三种,在更新数量较少的情况下,前两种性能不相上下。但是在更新字段增加,更新条数较多(500以上)建议使用第三种写法。

  • 常规写法,拼接多个单条更新语句。
  • CASE...WHEN... 写法
  • JOIN 写法

Batch Update

spring/mybatis/JDBI都支持这种批量更新方式。

这种更新方式需要设置jdbc连接的参数:

allowMultiQueries=true
# 完整url举例
jdbc.url=jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true

具体实现以Spring的JdbcTemplate为例。

batchUpdate的主要代码如下图:

首先检查了jdbc连接是否支持批量更新操作,如果allowMultiQueries值为false,将被拦截。

然后拼接了SQL语句,拼接代码如下:

直接用分号拼接。

CASE WHEN

示例:

UPDATE test
SET code = (
CASE
WHEN id = 1 THEN 11
WHEN id = 2 THEN 22
WHEN id = 3 THEN 33
END
) WHERE id IN (1,2,3);

注意:CASE WHEN一定要和WHERE语句一起使用,否则UPDATE会遍历和更新数据库中所有的行。会把未出现在WHEN中的数据都更新成null,如果code列设置为NOT NULL则会报错,否则会置为NULL或者默认值。

JOIN

这种写法不太常见。

UPDATE `test` a JOIN
(
SELECT 1 AS id, 11 AS code, 'holy' AS name
UNION
SELECT 2 AS id, 22 AS code, 'shit' AS name
) b USING(id, code)
SET a.name=b.name;

上述SQL要表达的更新语义是:将id=1且code=11的name更新为'holy',将id=2且code=22的name更新为'shit'。

注意,条件字段必须放在USING

性能对比

RC隔离级别

更新条数小(一般小于500条),CASE WHENJOIN优于UDPATE

更新条数较大(千级别),CASE WHEN效率迅速下降,UPDATE居中,推荐使用JOIN写法

RR隔离级别

JOIN性能优于CASE WHENCASE WHEN优于UPDATE

RC级别下的测试数据

数据库实例规格:8核,20G内存,100G硬盘

隔离级别:READ-COMMITTED

连接方式:JDBC

更新方式 更新300条记录平均耗时 更新3000条记录平均耗时
UPDATE 230ms 560ms
CASE WHEN 110ms 1170ms
JOIN 100ms 320ms

Mysql批量更新的三种方式的更多相关文章

  1. mysql批量更新的两种方式效率试验<二>

    Mysql两种批量更新的对比 简介: mysql搭载mybits框架批量更新有两种方式,一种是在xml中循环整个update语句,中间以‘:’隔开,还有一种是使用case when 变相实现批量更新, ...

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

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

  3. 仿联想商城laravel实战---5、无刷新的增删改查(动态页面更新的三种方式(html))

    仿联想商城laravel实战---5.无刷新的增删改查(动态页面更新的三种方式(html)) 一.总结 一句话总结: 直接js增加删除修改html 控制器直接返回处理好的页面 用双向绑定插件比如vue ...

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

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

  5. mysql备份 小结 (三种方式的详细解读)

    备份的本质就是将数据集另存一个副本,但是原数据会不停的发生变化,所以利用备份只能回复到数据变化之前的数据.那变化之后的呢?所以制定一个好的备份策略很重要 新建一个all.sqlvim all.sql在 ...

  6. mysql 批量更新的四种方法

    批量更新的方法: 1 ) 逐条更新 代码如下: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value'; 如果更新 ...

  7. mysql修改登录密码三种方式

    一.用SET PASSWORD命令 首先登录MySQL,使用mysql自带的那个客户端连接上mysql.  格式:mysql> set password for 用户名@localhost = ...

  8. mysql修改密码的三种方式

  9. python对mysql数据库操作的三种不同方式

    首先要说一下,在这个暑期如果没有什么特殊情况,我打算用python尝试写一个考试系统,希望能在下学期的python课程实际使用,并且尽量在此之前把用到的相关技术都以分篇博客的方式分享出来,有想要交流的 ...

随机推荐

  1. 您使用的私钥格式错误,请检查RSA私钥配置,charset = utf-8 密钥集不存在

    支付宝突然报异常 您使用的私钥格式错误,请检查RSA私钥配置,charset = utf-8 经排查:系统日志 System.Security.Cryptography.CryptographicEx ...

  2. eclipse右键空白、eclipse提示空白

    右键选择菜单经常显示空白.要试好多次才会出来.eclipse无法启动.启动报错 查看eclipse安装目录下的.metadata下的.log 里面会记录eclipse的报错信息 一般显示空白问题都是因 ...

  3. mysql一对多表结构,查询一的信息的同时统计多的数量

    res_resource_catalog表对于res_info_item表是一对多, 查询res_resource_catalog信息的同时,统计res_info_item中该条res_resourc ...

  4. 域名解析前面的前缀* @ www 分别代表什么

    www 是指域名前带 www的,以百度为例,就是 www.baidu.com@ 是指前面不带任何主机名的,以百度为例,就是 baidu.com* 是指泛解析,是指除已添加的解析记录以外的所有主机都以此 ...

  5. Mac OS X 10.14.3下如何给Python2.7.10安装MySQL-Python

    最近准备再看一下python ,弄个自动化部署的工具,一来就遇到了坑 sudo pip install MySQL-Python --global-option=build_ext --global- ...

  6. Error-Javascript:错误:页面文档类型(DOCTYPE)未声明!

    ylbtech-Error-Javascript:错误:页面文档类型(DOCTYPE)未声明! 1.返回顶部 1. HTML1300: 进行了导航.文件: TransferNote.aspxHTML1 ...

  7. 如何用 Go 实现热重启

    热重启 热重启(Zero Downtime),指新老进程无缝切换,在替换过程中可保持对 client 的服务. 原理 父进程监听重启信号 在收到重启信号后,父进程调用 fork ,同时传递 socke ...

  8. linux安装redis时报collect2: fatal error: cannot find 'ld'和In file included from adlist.c:34:0:

    如题,看了下该ld命令所在文件: [root@centos redis-]# whereis ld ld: /usr/bin/ld.gold /usr/bin/ld /usr/bin/ld.bfd / ...

  9. api-doc-php

    主要功能: 根据接口注释自动生成接口文档 演示地址 [Gitee Pages:]http://itxq.gitee.io/api-doc-php 开源地址: [GigHub:]https://gith ...

  10. Struts2数据封装

    首先是简单数据类型的封装 jsp页面 <%@ page contentType="text/html;charset=UTF-8" language="java&q ...