我编写了一个使用游标循环遍历行的过程。执行时间太长。
CREATE PROCEDURE test_port()
BEGIN
declare done BOOL default FALSE;
declare I,J,C,P,NOB int default 0;
declare n,k,t int default 0;
declare Lid int default 0;
declare inTS timestamp;
select max(id) into n from MAIN_TBL;
select ctrValue into k from ID_CNT;
set k=k+1;
WHILE k<=n
do
select SourcePort,DestPort,LinkID,NoOfBytes,insertTime into I,J,Lid,NOB,inTS from MAIN_TBL where id=k;
select count(*) into t from APP_PORTMAP_MSTR where Port in (I,J);
IF(t=1) THEN
select Port into P from APP_PORTMAP_MSTR where Port in (I,J);
SET C=0;
select count(*) INTO C from LINK_APP_TBL where LinkID=Lid and Port=P;
insert into TRAFFIC_HIST_TBL(LinkID,Port,NoOfBytes,Time_1) values(Lid,P,NOB,inTS);
IF(C=0) THEN
insert into LINK_APP_TBL(Port,LinkID) values(P,Lid);
END IF;
ELSE
if(I>J && J<>0) THEN
SET C=0;
select count(*) INTO C from LINK_APP_TBL where LinkID=Lid and Port=J;
IF(C=0) THEN
insert into LINK_APP_TBL(Port,LinkID) values(J,Lid);
insert into TRAFFIC_HIST_TBL(LinkID,Port,NoOfBytes,Time_1) values(Lid,J,NOB,inTS);
END IF;
ELSE
SET C=0;
select count(*) INTO C from LINK_APP_TBL where LinkID=Lid and Port=I;
IF(C=0) THEN
insert into LINK_APP_TBL(Port,LinkID) values(I,Lid);
insert into TRAFFIC_HIST_TBL(LinkID,Port,NoOfBytes,Time_1) values(Lid,I,NOB,inTS);
END IF;
END IF;
END IF;
SET k=k+1;
END WHILE;
END$$
\d ;
发生缓慢的可能原因是&#34; Insert&#34;陈述,但我们可以以任何方式改善表现吗?它一次处理大约10K条记录。
答案 0 :(得分:0)
每秒10k是一个很大的数字......您可以尝试删除一些您没有使用的索引,或者您可以将数据文件移动到更快的磁盘(如SSD),这会产生巨大的差异......
答案 1 :(得分:0)
好吧,在仔细分析了进程列表后,我发现“查询结束”状态需要很长时间。
因此,在搜索了一些线程之后,我发现将innodb_flush_log_at_trx_commit设置为0或2可以加快操作速度,但是它们禁止innodb成为ACID投诉。
如果操作系统崩溃或电源故障,更改值可能会导致1条指令丢失。