Mysql批量更新的三种方式
前言
批量插入由于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 WHEN
和JOIN
优于UDPATE
。
更新条数较大(千级别),CASE WHEN
效率迅速下降,UPDATE
居中,推荐使用JOIN
写法
RR隔离级别
JOIN
性能优于CASE WHEN
,CASE WHEN
优于UPDATE
。
RC级别下的测试数据
数据库实例规格:8核,20G内存,100G硬盘
隔离级别:READ-COMMITTED
连接方式:JDBC
更新方式 | 更新300条记录平均耗时 | 更新3000条记录平均耗时 |
---|---|---|
UPDATE | 230ms | 560ms |
CASE WHEN | 110ms | 1170ms |
JOIN | 100ms | 320ms |
转载于:https://www.cnblogs.com/AaronCui/p/10968893.html
Mysql批量更新的三种方式相关推荐
- mysql批量更新报错_Mysql批量更新的三种方式
前言 批量插入由于mysql的VALUES原生支持,使用较为便利. 批量更新的写法一般有三种,在更新数量较少的情况下,前两种性能不相上下.但是在更新字段增加,更新条数较多(500以上)建议使用第三种写 ...
- mybatis批量更新数据三种方法效率对比
探讨批量更新数据三种写法的效率问题. 实现方式有三种, 1> 用for循环通过循环传过来的参数集合,循环出N条sql,需要在db链接url后面带一个参数 &allowMultiQuer ...
- mybatis批量更新数据三种方法
具体的可以参考下面链接: mybatis批量更新数据三种方法效率对比_PreciousLife的博客-CSDN博客_mybatis 批量更新 此处说明下,若是使用for循环遍历方式,来生成 ...
- MySQL批量入库的几种方式详解
MySQL批量入库的几种方式详解 1. MySQL批量入库概述 2. Hutool封装jdbc方式 3. Jdbc直接或批量执行方式 4. MyBatis批量入库方式 5. MySQL批量入库总结 1 ...
- dapper mysql 批量_MySQL数据库之c#mysql批量更新的两种方法
本文主要向大家介绍了MySQL数据库之c#mysql批量更新的两种方法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 总体而言update 更新上传速度还是慢. 1: 简单的 ...
- Excel中数据透视表数据源更新的三种方式
Excel中数据透视表数据源更新的三种方式 1.在原有的基础上重新选择数据源 2.变数据源为表格形式,在创建一个透视表,之后如果添加的数据,选中透视表右键刷新即可 3.利用更新过的数据源再重新创建一个 ...
- 仿联想商城laravel实战---5、无刷新的增删改查(动态页面更新的三种方式(html))...
仿联想商城laravel实战---5.无刷新的增删改查(动态页面更新的三种方式(html)) 一.总结 一句话总结: 直接js增加删除修改html 控制器直接返回处理好的页面 用双向绑定插件比如vue ...
- 关于mysql存取图片的三种方式(含源码示例)
最近在做小程序的后台,要求将小程序用户以upload方法上传的图片保存到mysql数据库中. 然后机缘巧合三种方式都试了,所以专门整理出来分享给大家.可能有的地方说的不太对,欢迎大家帮纠正. ==== ...
- MySQL删除表的三种方式
文章目录 drop table truncate (table) delete from 三种方式的区别 用法总结 drop table drop 是直接删除表信息,速度最快,但是无法找回数据 例如删 ...
最新文章
- PHP远程DoS漏洞深入分析及防护方案
- Oracle计算时间差函数
- linux之which命令
- 循环的各种形式(不拘一格编程序之四)
- Bailian2944 单词替换【字符串流】
- Q82:三角形网格[Triangle Mesh]图形的平滑着色[Smooth Shading]
- Linux Web基础
- VBScript: 正则表达式(RegExp对象)
- 2022年的1024
- c语言中if函数应用举例,if函数(if函数的应用举例)
- Android kernel中wakeup_sources解析
- 都在说云原生?到底什么是云原生?
- 我写的阿拉伯数字转中文大写的一个方法
- c1欧洲语言标准是什么水平,CEFR 为什么会成为全球语言标准体系?
- jquery图片放大镜插件—jqzoom
- 固话呼转的设置及取消方法
- woocommerce 分类到菜单_我如何为每个WooCommerce产品类别创建不同的菜单?
- mybatis的常用标签用法总结
- 4.12 通联支付面试题
- aspx页面转换为html
热门文章
- 1.9编程基础之顺序查找 01查找特定的值
- JQuery和php方面的填空题,PHP复习题(问答题)
- Linux学习之内核模块编程
- Spring Boot文档阅读笔记-Creating Asynchronous Methods解析
- Qt文档阅读笔记-Q_ENUM官方解析及实例
- Java笔记-为客户端及服务端创建公私钥的密钥库
- Qt工作笔记-使用setFilterKeyColumn实现model的单行过滤
- Qt工作笔记-把文件逐行读到ListWidget中
- hive mysql 字符集_创建Hive表会自动更改mysql Metastore的字符集设置
- 梦幻西游物价稳定的服务器,梦幻西游:三界功绩对服务器点卡比例的影响,鬼区比例比火区高...