Mysql批量更新性能优化学习
转自:https://juejin.cn/post/7043596855829069861
1.更新
对表做多行更新的时候通常会遇到以下两种情况:
- 单语句批量更新(update a=a+1 where pk > 500)
- 多语句批量更新(update a=1 where pk=1;update a=12 where pk=7;...)
多语句批量更新脚本:
#!/bin/bash start_time=`date +%s%3N` /ssd/tmp/mysql/bin/mysql -h127.0.0.1 -uroot -P3316 -pabc123 -e "use test;source /ssd/tmp/tmp/1000/update.sql;" end_time=`date +%s%3N` echo "执行时间为:"$(($end_time-$start_time))"ms"
结果:
影响性能的地方主要原因:
- 如果会话是auto_commit=1,每次执行update语句后都要执行commit操作。commit操作耗费时间较久,会产生两次磁盘同步(写binlog和写redo日志)。在进行比对测试时,尽量将多个语句放到一个事务内,保证只提交一次事务。
- 向后端发送多语句时,后端每处理一个语句均会向client返回一个response包,进行一次交互。如果多语句使用一个事务的话,网络IO交互应该是影响性能的主要方面。之前在性能测试时发现网卡驱动占用cpu很高。//后面一句话的意思是,如果多语句使用一个事务,那么一次传输的数据请求就比较大,所以应该是传输数据占用内存、网络IO是主要影响。
2.批量更新优化
2.1 使用prepare
减少执行语句的解析时间来提高执行效率。但效率没有提升,一条update被拆分为2条,在MySQL客户端和MySQL进程之间的通讯次数增加了,所以增加了总耗时。
//具体没深入了解。
2.2 事务批量执行
以下脚本用于生成1000行update语句在一个事务内,更新c2的值等于1000以内的随机数:
#!/bin/bash echo "begin;" > update.sql for i in {1..1000} do echo "update t1 set c2=$((RANDOM%1000+1)) where c1=$i;" >> update.sql done echo "commit;" >> update.sql
echo和print作用类似。生成sql语句如下:
能明显优化:
2.3 特殊sql
//没看,太复杂了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2018-11-19 KL与JS散度学习[转载]
2018-11-19 PAT 1138 Postorder Traversal [比较]
2018-11-19 PAT 1031 Hello World for U[一般]
2018-11-19 PAT 1142 Maximal Clique[难]
2018-11-19 香农熵学习+例子[转载]
2018-11-19 全概率+贝叶斯[转载]