SQL优化实战:利用临时表让update执行得飞快
2021/12/22 2:20:07
本文主要是介绍SQL优化实战:利用临时表让update执行得飞快,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
上线后需要补数据。我在jira提了一个sql审批工单。领导批复后,找运维伙伴执行。
如下是sql。运维小伙执行的时候,发现持续2分钟都没完事。考虑到update执行时间过长可能会影响到生产系统对这两张表的操作,于是,赶紧stop。
UPDATE levy_account_recharge a JOIN trans_separate_order b ON a.order_no=b.order_no AND a.status = 'SUCCESS' AND b.status='SUCCESS' SET a.SUCCESS_time=b.split_finish_time WHERE a.SUCCESS_time IS NULL
经查,实际影响数据也就50多条。那么,这个update语句为什么这么慢呢?
查看两张表的结构。其中 levy_account_recharge 的 order_no字段是主键,类型是varchar(32)。trans_separate_order 表的主键不是order_no, order_no字段是bigint类型,没有索引。
看来,慢的原因有2:一是order_no字段数据类型不一致,二是trans_separate_order的order_no没有索引。
办法总比困难多。
改用临时表试试。再执行,发现性能提升很快,毫秒级。
-- 耗时:0.234 sec CREATE TEMPORARY TABLE tmp2 SELECT a.order_no, b.split_finish_time FROM levy_account_recharge a JOIN trans_separate_order b ON a.order_no=b.order_no AND a.status = 'SUCCESS' AND b.status='SUCCESS' WHERE a.SUCCESS_time IS NULL START TRANSACTION; -- 耗时:0.131 sec UPDATE levy_account_recharge a JOIN tmp2 b ON a.order_no=b.order_no SET a.SUCCESS_time=b.split_finish_time ; ROLLBACK;
《码出高效》这本书里,在sql优化这一章节里,也提到了“使用临时表”这一点。
这篇关于SQL优化实战:利用临时表让update执行得飞快的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现
- 2024-05-30我们小公司,哪像华为一样,用得上IPD(集成产品开发)?
- 2024-05-30java excel上传--poi
- 2024-05-30安装笔记本应用商店的pycharm,再安排pandas等模块,说是没有打包工具?
- 2024-05-29java11新特性
- 2024-05-29哪些无用敏捷指标正在破坏敏捷转型?
- 2024-05-29鸿蒙原生应用再新丁!新华社 入局鸿蒙
- 2024-05-29设计模式 之 迭代器模式(Iterator)