有如图的两个表。从A表中找到每一个ds_code对应的rec_num的最大值和表B中此ds_code对应的rec_num的最大值相比较如果表A的rec_num大于或者等于表B的rec_num,就把最大值所在的记录插入到B表中。如果表A中存在表B中没有的ds_code则把表A中此ds_code对应rec_num最大值所在记录直接插入表B。由于A表的ds_code种类太多(大概有12万左右,A表中的记录大约有2200万条),我写了一个存储过程把ds_code当作参数传入存储过程判断是否符合条件然后插入表B。表A中的数据每天都会更新,所以表B的数据也要每天更新。我现在是用shell配合存储过程实现表B的自动更新。从表A中得到ds_code(大约12万个) 然后做成调用存储过程的语句即call dataset_maxnumber_load_procedure()(大约12万行)。但是这样每次花费的时间太长。每次的执行时间大约需要20分钟。大家帮我看看有没有其他方法能提高运行效率或者有没有其他写法能达到同样的目的。
create procedure dataset_maxnumber_load_procedure(IN dscode varchar(50))
begin
declare number_recnum double;
declare maxnumber_recnum double;
set number_recnum=(select max(cast(rec_num as signed)) from dataset_number_table where ds_code= dscode);
set maxnumber_recnum=(select max(cast(rec_num as signed)) from dataset_maxnumber_table where ds_code= dscode);
if(maxnumber_recnum is null or number_recnum > maxnumber_recnum or number_recnum = maxnumber_recnum) then
insert ignore into dataset_maxnumber_table select * from dataset_number_table
where rec_num = number_recnum
and ds_code = dscode order by exert_date;
end if;
end;call dataset_maxnumber_load_procedure("A001");
create procedure dataset_maxnumber_load_procedure(IN dscode varchar(50))
begin
declare number_recnum double;
declare maxnumber_recnum double;
set number_recnum=(select max(cast(rec_num as signed)) from dataset_number_table where ds_code= dscode);
set maxnumber_recnum=(select max(cast(rec_num as signed)) from dataset_maxnumber_table where ds_code= dscode);
if(maxnumber_recnum is null or number_recnum > maxnumber_recnum or number_recnum = maxnumber_recnum) then
insert ignore into dataset_maxnumber_table select * from dataset_number_table
where rec_num = number_recnum
and ds_code = dscode order by exert_date;
end if;
end;call dataset_maxnumber_load_procedure("A001");
解决方案 »
- mysql集群(windows XP下) 问题
- 请高手指点DB2数据库中数据导入到MYSQL中
- mysql 同步出错,slave 报Error in Log_event:'Event too big' event_type: 120
- Mysql多表数据导入
- Win服务器经常出现 Can't connect to MySQL server on 'localhost' (10061),怎么解决?
- 同一条SQL在Windows的服务器上运行正常,在Linux服务器上却不能执行
- mysql怎么备份表
- 在线等, Mysql这一句怎么出错?create table if not exists test3(id int UNSIGNED AUTO_INCREMENT);
- mysql的配置问题,请高手指正
- 一个查询问题。请大家指教
- [求助] 大神们,求帮忙啊,关于MySQL 把数据统计然后动态行显示
- mysql自动停止
先从思路上聊聊吧。1 这是一个典型的增量处理,无论A表有少数据,每天更新或插入的只有12万。
所以,如果index能比较高效地做的话,就index;
如果效率低,那么用date的partition或者单独拿一张表先存下来,接着再分别放进A表和B表2 对于B表的更新是一个插入或更新的问题。
所以,如果逻辑复杂,可以用procedure做;如果逻辑简单,用replace into效率应该更高,也更容易利用高级特性调优。
12万件的插入/更新对于一个sql来说并不是太大,undo和表本身应该都可以支撑,所以这个问题是OK的。
判断最大值的逻辑也不复杂。接下来,只要12万件数据里,大部分是需要更新的数据,就值得用replace into来试试。