文章目录

  • 一、前言
  • 二、原生的写法
    • 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 whenifcase 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的批量更新及性能测试相关推荐

  1. MySQL的批量更新和批量新增优化

    MySQL的批量更新和批量插入优化 如果需要批量插入和批量更新操作就需要进行sql 的优化,否则近30万条数据的插入或更新就会耗费几分钟甚至更多的时间, 此文仅批量插入和批量更新的几种优化. 批量插入 ...

  2. mysql的批量更新的语法,MySql 批量更新语法

    mysql数据库在批量更新某表的字段时,语法如下: UPDATE A  AS a INNER JOIN ( SELECT * FROM A WHERE .... ) AS b ON a.order_i ...

  3. mysql update 批量更新_mysql 批量更新的两种方法

    本文介绍两种批量更新数据方法 数据准备 create table account ( id int auto_increment primary key, balance int not null ) ...

  4. mysql语句批量更新数据库_sql 更新批量数据库语句

    JDBC(六)批量处理sql 批量更新是分组在一起的一批更新,并以"批量"方式发送到数据库,而不是逐个发送更新. 一次发送一批更新到数据库,比一个一个发送更快,等待每个更新完成. ...

  5. MySql——MySqlDataAdapter批量更新

    目录  前言  正文   批量更新方法  前言   MySqlDataAdapter的Update方法不仅仅能够做到更新,还可以删除,添加,查看MySql支持C#的.dll库,会发现其实很多东西都继承 ...

  6. Mysql + Mybatis批量更新报错 BadSqlGrammarException

    报错 项目启动没问题,查询删除等接口都没问题,Mybatis写法和SQL都没问题,数据也都没问题,批量更新数据时,报错如下 2022-03-29 10:20:37.880 ERROR 133132 - ...

  7. mysql update批量更新_MySql中4种批量更新的方法

    mysql 批量更新共有以下四种办法 1..replace into 批量更新 replace into test_tbl (id,dr) values (1,'2'),(2,'3'),...(x,' ...

  8. mysql jdbc批量更新_jdbc批量更新数据

    { boolean add = true; Connection conn = null; PreparedStatement pst = null; String sql = null; try { ...

  9. mysql allowmultiqueries=true_Mysql批量更新的一个坑-allowMultiQueries=true允许批量更新(转)...

    实际上,我们经常会遇到这样的需求,那就是利用Mybatis批量更新或者批量插入,但是,实际上即使Mybatis完美支持你的sql,你也得看看你说操作的数据库是否支持,而阿福,最近就遇到这样的一个坑. ...

最新文章

  1. javascript正则表达式介绍
  2. php 登录注册api接口代码
  3. linux到不了启动界面,Linux 界面不能启动的解决
  4. TCP的连接和释放过程
  5. React组件通信--props
  6. java设置并行度_控制Java并行流的并行度
  7. Java多线程实现多客户端的通信
  8. 计算机发展英语思维导图,怎样画出英语课文总结思维导图
  9. 什么水平的java工程师月薪3万起?
  10. 计算机组成原理课后答案(唐朔飞第三版) 第四章
  11. 详细解析十大排序算法(js实现)
  12. “远端www服务支持TRACE请求“验证及修复jetty,非框架,内嵌版本
  13. 基于51单片机的12864液晶演示器驱动
  14. 上海滩玩起了黑科技,苏宁Biu店带你刷脸扫货
  15. 界面(1):对话框和菜单 打印和按钮等杂项
  16. 十二星座日期、性格、特性查询表
  17. Smith Chart - for myself
  18. MySQL Study之--Mysql数据库备份工具(mysqldump)
  19. 只要一下载大文件,电脑的联网客户端就掉线………………哈哈,已解决!!!
  20. 建立新闻内容的数据库_使用数据新闻学产生内容创意

热门文章

  1. 正面管教PHP交流互助会,父母的心态决定孩子的状态/慧育家正面管教家长讲师认证班...
  2. 【SpringCloud】Ribbon:负载均衡
  3. TensorRT5 yoloV3加速
  4. 深度学习如何选择模型
  5. Python 守护线程
  6. undefined reference to symbol ‘_ZN2cv7imwriteERKNS_6StringERKNS_11_InputArrayERKSt6vectorIiSaIiEE‘
  7. 投影与三维视觉——本征矩阵和基础矩阵
  8. OpenCV之CvMat Mat IplImage之间相互转换
  9. iphone分辨率_iPhone 的屏幕为什么比安卓更丝滑?
  10. idea在Mybatis的xml里面写sql时,表名、字段、报红问题的解决方法