Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
603 views
in Technique[技术] by (71.8m points)

mysql单次批量大数据的删除和插入

需求:

问题描述

数据库MySQL,引擎innodb,当前表1数据接近2000万条
需要写定时任务,每天运行一次,也可以运行多次,将表1中最远一天的数据迁移至另外的表2
大概每天产生的数据有将近10万条
总结下来:每天需要从表1中删除将近10万条数据,然后把这10万条数据插入到表2,并且要保证从表1中删除和向表2中插入是原子的,不能出现表1中删除成功,但是表2中插入失败,或者表1中删除失败,但是表2中插入成功

哪位老哥有好的主意,望指点一下小弟,太迷茫了~

想到的解决方法

由于项目是golang写的,用的xorm框架,我目前想到的方法是:
1,select id from t2 order by id desc limit 1,获取到表2中最新的数据的主键id,保存为max_id
2,select * from t1 where id > max_id order by id asc limit 1000,从表1中查询到最远的1000条数据,保存在slice中。由于是使用的xorm框架,所以直接在方法中传入一个slice,slice中保存这1000条数据。
3,开启事务,遍历slice,读取id,根据id从表1中删除,并在表2插入

这么做有什么风险吗?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

如果你中间没有什么数据需要处理的话,直接用sql语句来搬移应该是效率最高的

INSERT INTO xxx SELECT * FROM yyy WHERE zzz;
DELETE FROM yyy WHERE zzz;

一定要在事务中执行。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

57.0k users

...