本次主要陈述:利用存储过程与循环,来实现大表之间快速更新;
A表:5000万;B表5000万;利用A表更新B表里面的nic_code字段,有相同的主键id,其中A.id为自增长
数据测试,共两个方式,一为直接写update语句,二为通过存储过程+循环实现:
1、直接写update语句:
update A,B
set A.code =B.code
where A.id = B.id
;
采用explain执行上面的语句发现,需要浏览A表全表,最终更新时间是按照小时计算的:
2、通过存储过程+循环实现:
将表分批次执行,每次执行1万条,加上A.id为自增长的原因,执行效率大大提高,最终更新时间约半小时
CREATE DEFINER=`test_xxx`@`***.***.%` PROCEDURE `update_sql`()
BEGIN
DECLARE begin_id INT(12);
DECLARE end_id INT(12);
DECLARE t_step INT(12);
DECLARE v_bg INT(12);
DECLARE v_end INT(12);
SELECT min(id),max(id) INTO begin_id,end_id FROM A;
SET t_step = 10000;
SET v_bg = begin_id;
SET v_end = v_bg + t_step;
WHILE v_bg <= end_id DO
UPDATE
B , A
SET
B.code= A.code
WHERE
B.id = A.id
AND
A.id BETWEEN v_bg and v_end;
COMMIT;
SET v_bg = v_end + 1;
SET v_end = v_bg + t_step;
end WHILE;
END