如何大量UPDDATE和INSERT数据?

这几天,发现自学是有限制的。

今天遇见一个问题:大量UPDATE数据,差点锁表。
然后我又复刻了我之前遇见的问题:

我有一个表1,然后备份了一个表2,由于误操作,将数据库中一个字段为1的数据刷空了。
大概逻辑是:

UPDATE T1 SET COLNUM1 =NULL;

我where条件写错了又没检查。
刷了4W行。

之前备份了表2,拿来用

怎么刷呢?

UPDATE t1 set column1=1 where ID in (select ID from t2 where column=1)

然后……整个表一秒钟读写100M的数据,读了大概1000S还没读完。

XXX的,然后停止进程,回滚又回滚了1000S。

整个表大小大概40M,数据不到10W条。

然后整理了一下逻辑:
第一,数据库先执行

SELECT ID FROM T2 WHERE COLUMN=1;

然后,就是执行4W次:

UPDATE T1 SET COLUMN1=1 where Id=1;
UPDATE T1 SET COLUMN1=1 where Id=2;
……………………………………………………
UPDATE T1 SET COLUMN1=1 where Id=200000;

然后,执行的时候会加锁。

一行大概执行0.05S,按照逻辑就算是10W行大概也就500S。

但是逻辑可能是因为:加锁。

我复现了一下,不清楚原因。但是肯定不能这么写……

然后上网查,XXX原来UPDATE和INSERT也可以多表联查。

insert后面不是可以直接插入select语句嘛,直接

INSERT INTO T1
select *  from t2;

这个OK。

UPDATE 也可以。

UPDATE t1,t2 
set t1.column1=t2.tolumn1
where t1.ID =t2.ID;

即可。

XXX写在第六个。就是一个where连表。

然后我执行了一下,发现:如果是数字INT作为主键速度OK。(和我误操作UPDATE数量级差不多一样快,10S多即可)
文本作为主键直接拉了胯。(varchar255)

但是千万别写反了啊——别把备份刷了。
比如我备份是t2,你写了个
set t2,column1=t1.column1,那就真的GG了。
开一个手动提交,然后确认下再执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值