存储过程+循环实现mysql大表之间快速更新update

本次主要陈述:利用存储过程与循环,来实现大表之间快速更新;

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

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值