mysql 双游标_mysql开发之-使用游标双层嵌套对总表进展拆分为帖子表和回复表_mysql...

本文介绍了如何使用MySQL的双游标进行数据拆分,将一个总表的数据拆分为帖子表和回复表。通过创建临时表、游标嵌套以及处理数据的逻辑,实现了高效的数据拆分。在30G内存下,8488276行数据拆分耗时39分钟。
摘要由CSDN通过智能技术生成

mysql开发之---使用游标双层嵌套对总表进行拆分为帖子表和回复表

注意点:

(1)进行拆分的总表表名是不同的,所以创建临时表,把总表的数据先插入临时表

(2)为了避免最外层游标轮询数据结束时,抛出 not found 退出程序,不会执行关闭游标等后续操作,定义continue handler, declare continue handler for not found set done1=1;

1.1、外部存储过程调用主存储过程

CREATE PROCEDURE `bbs_split_thread_post_outer`(IN `in_tabname` varchar(128))

BEGIN

declare v_row_count int(11);

declare v_sql varchar(200);

-- 必须清空临时表bbs_fromask_importask_tmp

select sysdate();

truncate table bbs_fromask_importask_tmp;

set @sql=concat('insert into bbs_fromask_importask_tmp select * from ',in_tabname,';');

prepare stmt from @sql;

execute stmt;

call bbs_split_thread_post();

select sysdate();

END

CREATE PROCEDURE `bbs_split_thread_post`()

BEGIN

declare v_source_count int(11);

declare v_thread_pkid int(11);

declare v_thread_pkid_uni_count int(11);

declare done1,done2 int default 0;

declare v_cur_thread_pkid cursor for select pkid,count(*) from bbs_fromask_importask_tmp group by pkid;

declare continue handler for not found set done1=1;

-- 清空临时表

truncate table pre_data_thread_tmp;

truncate table pre_data_post_tmp;

-- 判断原表是否有数据,没有什么也不做

select count(*) into v_source_count from bbs_fromask_importask_tmp;

if v_source_count>0 then

select ifnull(max(id),0) into @thread_max_id from yaolanbbs.pre_data_thread; -- 可做修改

select @thread_max_id;

-- 打开游标

open v_cur_thread_pkid;

repeat

fetch v_cur_thread_pkid into v_thread_pkid,v_thread_pkid_uni_count;

-- 每次fetch最大id自增1

if not done1 then

set @thread_max_id=@thread_max_id+1;

insert into pre_data_thread_tmp(id,title,age,rule,param)

select @thread_max_id,t1.qtitle,t1.age,'age',t1.age from bbs_fromask_importask_tmp t1 where t1.pkid=v_thread_pkid limit 1;

-- 根据pkid对一组数据进行处理

begin

declare v_post_answer text;

declare v_cur_post_record cursor for select t1.answer from bbs_fromask_importask_tmp t1 where t1.pkid=v_thread_pkid;

declare exit handler for not found close v_cur_post_record;

-- declare continue handler for not found set done2=1;

insert into pre_data_post_tmp(tid,text,sort)

select @thread_max_id,t1.qdesc,1 from bbs_fromask_importask_tmp t1 where t1.pkid=v_thread_pkid limit 1;

set @sort=2; ######设置值

open v_cur_post_record;

repeat

fetch v_cur_post_record into v_post_answer;

-- select @sort;

-- select v_post_answer;

insert into pre_data_post_tmp(tid,text,sort) values(@thread_max_id,v_post_answer,@sort);

-- insert into testincre values(@sort,v_post_answer);

set @sort=@sort+1;

until 0 end repeat;

-- select curdate(); 不会执行的原因,定义exit handler

close v_cur_post_record;

end;

end if;

until done1 end repeat;

-- 关闭游标

close v_cur_thread_pkid;

-- select curdate();

/*-- 导入最终表

insert into pre_data_thread(id,title,create_time,age,rule,param)

select id,title,create_time,age,rule,param from pre_data_thread_tmp;

insert into pre_data_post(tid,text,sort,create_time)

select tid,text,sort,create_time from pre_data_post_tmp;

*/

end if;

END

总结:

(1)30G内存没有负载的情况下,8488276行拆为两个表共10500000行用时39分钟

版权声明:本文为博主原创文章,未经博主允许不得转载。

欢迎大家阅读《mysql开发之-使用游标双层嵌套对总表进展拆分为帖子表和回复表_mysql》,跪求各位点评,by 搞代码

e7ce419cf2d6ad34d01da2ceb8829eed.png

微信 赏一包辣条吧~

023a57327877fb4402bcc76911ec18ea.png

支付宝 赏一听可乐吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值