原生mysql的批量更新及性能测试
文章目录
- 一、前言
- 二、原生的写法
- 1、用到的函数是case ...when ...then
- 2、php拼接sql
- 3、是否能用到索引
- 三、批量更新的性能测试(50W数据)
- 1、首先是更新不同数量的性能展示
- 2、关于sql长度
- 3、关于in查询
- 4、关于case..when和if等的性能比较
- 5、为什么我的case..when用不到索引?
- 6、其他
一、前言
我们在做批量更新的时候,经常会使用到框架的批量更新API
,那么原生的mysql
要怎么做批量更新呢,下面我们来研究下原生的批量更新以及性能测试。(如果有框架,谁又愿意用原生的呢!!!)
mysql环境:
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.5.53 |
+-----------+
1 row in set (0.00 sec)
二、原生的写法
1、用到的函数是case …when …then
手册手册
拼接出来的sql形如:
"update student set click_time =
case test_id
WHEN 70300 THEN 1578832683
WHEN 70301 THEN 1578832683
END,
installed_at = case test_id
WHEN 70300 THEN 1578832684
WHEN 70301 THEN 1578832684
END WHERE test_id IN (70301,70300)
语意: 类似于编程语言中的流程控制语句,当test_id=xxx
的时候,就设置click_time=xxx
,否则就设置click_time= ooo
。多个字段设置的话参考博主这里的写法,直接设置即可,最后面跟的in
条件是限制test_id
的范围。
2、php拼接sql
$sql_pre = "update student set ";$sql_click_pre = " click_time = case test_id ";$sql_install_pre = " installed_at = case test_id ";$sql_click_end = "";$sql_install_end = "";foreach($arr as $v){$sql_click_end .= sprintf("WHEN %d THEN %d ", $v[0], $v[1]);$sql_install_end .= sprintf("WHEN %d THEN %d ", $v[0], $v[2]);}// 这里拼接sql,拼接出来就是如上所示的例子$sql = $sql_pre.$sql_click_pre.$sql_click_end.'END, ' .$sql_install_pre.$sql_install_end. " END WHERE test_id IN ($sqls)" ;var_dump($sql);$rs = mysqli_query($link, $sql);if (!$rs) {die('更改失败: ' . mysqli_error($link));}
拼接的操作简单,就是循环数组,拼接sql
即可。
3、是否能用到索引
mysql> explain update xxxx set click_time = case user_id WHEN 1070768 THEN 1577624803 WHEN 1025435 THEN 1577625891 END, installed_at = case user_id WHEN 1070768 THEN 1577624904 WHEN 1025435 THEN 1577625964 END WHERE user_id IN (1070768,1025435);
+------+-------------+--------------+-------+----------------------+----------------------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+--------------+-------+----------------------+----------------------+---------+------+------+-------------+
| 1 | SIMPLE | user_tracker | range | uniq_user_id_tracker | uniq_user_id_tracker | 8 | NULL | 2 | Using where |
+------+-------------+--------------+-------+----------------------+----------------------+---------+------+------+-------------+
根据执行计划,显然是用到了索引的,最起码代表性能不至于太差。
三、批量更新的性能测试(50W数据)
1、首先是更新不同数量的性能展示
每次更新100:耗时:88ms
每次更新300:耗时:105ms
每次更新500:耗时:144ms
每次更新1000:耗时:202ms
每次更新1500:耗时:242ms
每次更新2000:耗时:422ms
这几个值都是博主这边实验10
次,计算出来的平均值。从时间上来看,大于1500
条之后,性能出现了急剧缩减,小于1500
条数据的时候表现还不错。不过我们一般也不会一次更新这么多条数据,大部分都会分批量进行(一次循环500
个之类的)
2、关于sql长度
手册手册
sql
长度的话,一般是默认16M
,我们普通的sql
是完全不会超过的,这里有兴趣的话,可以去参考我的另一篇博客:mysql批量插入数据,一次插入多少行数据效率最高?
3、关于in查询
我们的sql
里面是带有in
查询的,不过经过博主上次的测试,in
查询的性能整体表现比较平滑,没有出现性能急剧的变化,所以一般情况下正常使用即可,不用特别担心。
参考我的另一篇:mysql的in查询参数限制,多少数据量会造成性能下降?什么时候创建临时表合适?
4、关于case…when和if等的性能比较
这两个函数性能差距不大,比对次数尽量少一些就行,很多函数的内部就是case when ,if
和case then
等语句,最后会被转化为机器指令,速度极快(cpu处理)
参考:https://bbs.csdn.net/topics/392056484
5、为什么我的case…when用不到索引?
博主在查资料的时候,发现有些文章里面的case..when
因为没有用到索引,所以效率十分低下。最明显的两个错误,一个是在sql
里面对字段进行函数计算,另一个就是类型对不上,你弄个int
类型非得和string
类型比较,能用到索引才怪。
case..when
的索引部分就和其他字段的索引一样,按照规范去使用即可。
6、其他
参考链接:
https://www.jianshu.com/p/c19c99a60bb7 : case when的例子比较
https://www.dazhuanlan.com/2019/09/13/0a2a08989237/ : case when用不到索引的情况,因为函数影响
http://www.gaodevops.com/articles/219/mysql-you-hua-an-li-case-when-jin-xing-sql-gai-xie-you-hua?order_by=vote_count& :case when 优化
https://juejin.im/post/5a30cb8e6fb9a0451f30edd9 :很清晰的用法
https://blog.csdn.net/qq_30038111/article/details/79611167 :case when的用法,包括简单函数和搜索函数
最近流感猖獗,博主不幸中标,实在苦不堪言。希望各位在临近年关之际,注意身体,注意保暖,过个好年哈哈
end
原生mysql的批量更新及性能测试相关推荐
- MySQL的批量更新和批量新增优化
MySQL的批量更新和批量插入优化 如果需要批量插入和批量更新操作就需要进行sql 的优化,否则近30万条数据的插入或更新就会耗费几分钟甚至更多的时间, 此文仅批量插入和批量更新的几种优化. 批量插入 ...
- mysql的批量更新的语法,MySql 批量更新语法
mysql数据库在批量更新某表的字段时,语法如下: UPDATE A AS a INNER JOIN ( SELECT * FROM A WHERE .... ) AS b ON a.order_i ...
- mysql update 批量更新_mysql 批量更新的两种方法
本文介绍两种批量更新数据方法 数据准备 create table account ( id int auto_increment primary key, balance int not null ) ...
- mysql语句批量更新数据库_sql 更新批量数据库语句
JDBC(六)批量处理sql 批量更新是分组在一起的一批更新,并以"批量"方式发送到数据库,而不是逐个发送更新. 一次发送一批更新到数据库,比一个一个发送更快,等待每个更新完成. ...
- MySql——MySqlDataAdapter批量更新
目录 前言 正文 批量更新方法 前言 MySqlDataAdapter的Update方法不仅仅能够做到更新,还可以删除,添加,查看MySql支持C#的.dll库,会发现其实很多东西都继承 ...
- Mysql + Mybatis批量更新报错 BadSqlGrammarException
报错 项目启动没问题,查询删除等接口都没问题,Mybatis写法和SQL都没问题,数据也都没问题,批量更新数据时,报错如下 2022-03-29 10:20:37.880 ERROR 133132 - ...
- mysql update批量更新_MySql中4种批量更新的方法
mysql 批量更新共有以下四种办法 1..replace into 批量更新 replace into test_tbl (id,dr) values (1,'2'),(2,'3'),...(x,' ...
- mysql jdbc批量更新_jdbc批量更新数据
{ boolean add = true; Connection conn = null; PreparedStatement pst = null; String sql = null; try { ...
- mysql allowmultiqueries=true_Mysql批量更新的一个坑-allowMultiQueries=true允许批量更新(转)...
实际上,我们经常会遇到这样的需求,那就是利用Mybatis批量更新或者批量插入,但是,实际上即使Mybatis完美支持你的sql,你也得看看你说操作的数据库是否支持,而阿福,最近就遇到这样的一个坑. ...
最新文章
- javascript正则表达式介绍
- php 登录注册api接口代码
- linux到不了启动界面,Linux 界面不能启动的解决
- TCP的连接和释放过程
- React组件通信--props
- java设置并行度_控制Java并行流的并行度
- Java多线程实现多客户端的通信
- 计算机发展英语思维导图,怎样画出英语课文总结思维导图
- 什么水平的java工程师月薪3万起?
- 计算机组成原理课后答案(唐朔飞第三版) 第四章
- 详细解析十大排序算法(js实现)
- “远端www服务支持TRACE请求“验证及修复jetty,非框架,内嵌版本
- 基于51单片机的12864液晶演示器驱动
- 上海滩玩起了黑科技,苏宁Biu店带你刷脸扫货
- 界面(1):对话框和菜单 打印和按钮等杂项
- 十二星座日期、性格、特性查询表
- Smith Chart - for myself
- MySQL Study之--Mysql数据库备份工具(mysqldump)
- 只要一下载大文件,电脑的联网客户端就掉线………………哈哈,已解决!!!
- 建立新闻内容的数据库_使用数据新闻学产生内容创意
热门文章
- 正面管教PHP交流互助会,父母的心态决定孩子的状态/慧育家正面管教家长讲师认证班...
- 【SpringCloud】Ribbon:负载均衡
- TensorRT5 yoloV3加速
- 深度学习如何选择模型
- Python 守护线程
- undefined reference to symbol ‘_ZN2cv7imwriteERKNS_6StringERKNS_11_InputArrayERKSt6vectorIiSaIiEE‘
- 投影与三维视觉——本征矩阵和基础矩阵
- OpenCV之CvMat Mat IplImage之间相互转换
- iphone分辨率_iPhone 的屏幕为什么比安卓更丝滑?
- idea在Mybatis的xml里面写sql时,表名、字段、报红问题的解决方法