专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
芋道源码  ·  谈一谈 分库分表 vs NewSQL数据库 ·  1小时前  
芋道源码  ·  一款轻便、安全、免费的远程桌面工具 ·  1小时前  
芋道源码  ·  Spring Boot 3.2 ... ·  昨天  
Java编程精选  ·  成年人欲望程度排行榜TOP 10 ·  2 天前  
51好读  ›  专栏  ›  ImportNew

小伙在公司用了个 insert into select 居然被开除了

ImportNew  · 公众号  · Java  · 2024-05-31 11:30

正文

请到「今天看啥」查看全文



我们可以从这段代码中看到,OOM 的原因很简单,我们直接将数据全部加载内存,内存不爆才怪。



再来看看第二个方案,到底发生了啥。


为了维持表的性能,同时保留有效数据,经过商量定了一个量,保留 10 天的数据,差不多要在表里面保留 1kw 的数据。所以同事就做了一个时间筛选的操作,直接:


insert into select ... dateTime < (Ten days ago)

爽极了,直接就避免了要去分页查询数据,这样就不存在OOM啦。还简化了很多的代码操作,减少了网络问题。


为了测试,还特意建了 1kw 的数据来模拟。测试环境当然是没有问题啦,顺利通过。考虑到这个表是一个支付流水表,于是将这个任务做成定时任务,并且定在晚上 8 点执行。


晚上量也不是很大,自然是没有什么问题,但是第二天公司财务上班,开始对账,发现资金对不上,很多流水都没有入库。最终排查发现晚上 8 点之后,陆陆续续开始出现 支付流水插入失败 的问题,很多数据因此丢失。


最终定位到了是迁移任务引起的问题,刚开始还不明所以,白天没有问题,然后想到晚上出现这样的情况可能是晚上的任务出现了影响,最后停掉该任务的第二次上线,发现没有了这样的情况。


复盘


问题在哪里?


为什么停掉迁移的任务之后就好了呢?这个 insert into select 操作到底做了什么?我们来看看这个语句的 explain。






请到「今天看啥」查看全文