前言

批量插入由于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. sourceforge文件下载过慢

    sourceforge文件下载过慢,可以用下面网址镜像下载, http://sourceforge.mirrorservice.org 按搜索到的项目的英文字母依次查询,如http://sourcef ...

  2. MySQL避免插入重复记录:唯一性约束

      mysql在存在主键冲突或者唯一键冲突的情况下,根据插入策略不同,一般有以下三种避免方法.1.insert ignore2.replace into3.insert on duplicate ke ...

  3. 使用helm进行kubernetes包管理

    1. 安装helm package https://github.com/helm/helm/blob/master/LICENSE 2. 将 helm 配置到环境变量 3. 使用helm的前提是安装 ...

  4. 性能测试-GC问题整理

    年轻代与老年代的调优(笔记整理) 几个常见名词 年轻代(young 区)从年轻代空间(包括Eden和Survivor 区域)回收内存被称为 Minor GC空间太小可能导致对象直接进入 old区 .如 ...

  5. 第08组 Beta冲刺(1/4)

    队名 八组评分了吗 组长博客链接(2分) 小李的博客 作业链接 组员1李昕晖(组长) 过去两天完成了哪些任务 文字/口头描述 12月3号了解各个小组的进度与难以攻破的地方,晚上安排开会,安排新的冲刺任 ...

  6. Dubbo自定义Filter统一处理异常

    Dubbo版本:2.7 使用自定义Filter注意事项 1.自定义名称不能和默认Filter相同,否则可能不生效 2.只用定义Filter类和META-INF下的文本文件,不用添加配置,@Activa ...

  7. sqlserver cdc用法

    SELECT top(10)  * from (SELECT  sys.fn_cdc_map_lsn_to_time([__$start_lsn])  'addtime',* FROM cdc.dbo ...

  8. 如何将业务代码写得像诗一样(使用注解+单例+工厂去掉一大波if和else判断)

    1.订单控制器,提供一个根据商品id和银行渠道id计算商品折后价格的接口: import org.springframework.web.bind.annotation.GetMapping; imp ...

  9. 用python批量下载图片

    一 写爬虫注意事项 网络上有不少有用的资源, 如果需要合理的用爬虫去爬取资源是合法的,但是注意不要越界,前一阶段有个公司因为一个程序员写了个爬虫,导致公司200多个人被抓,所以先进入正题之前了解下什么 ...

  10. unity 如何打开本地文件夹,并选中文件

    public static void OpenDirectory(string path, bool isFile = false) { if (string.IsNullOrEmpty(path)) ...