这几天,发现自学是有限制的。
今天遇见一个问题:大量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了。
开一个手动提交,然后确认下再执行。