2013-08-21 165 views
0

我写过一个使用光标循环遍历行的过程。执行时间太长。
mysql光标需要很长时间才能执行

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 ; 



的原因可能是缓慢的“插入”语句,但是我们可以提高任何方面的表现?它一次处理大约10K条记录。每秒

+0

它基本上检查它端口存在于主表,如果是的话则与所述标准端口的条目。否则,较小的港口被认为是一个标准港口,并进入一个入口。 – Ajit

回答

0

那么,仔细分析过程列表后,我发现“查询结束”状态需要很长时间。

因此,在搜索一些线程后,我发现将innodb_flush_log_at_trx_commit设置为0或2会加速操作,但禁止innodb成为ACID投诉。

如果发生操作系统崩溃或电源故障,更改这些值可能会导致1个指令丢失。

价: UPDATE statements are in "query end state"

0

10K是一个大数目......你可以尝试删除你不使用一些索引,或者您可以将您的数据文件移动到更快的磁盘(如SSD),使一个巨大的差异...

+0

我认为你是对的,但截至目前我没有任何这样的规定,因为我们正处于POC阶段。我可以通过的唯一途径是尽可能地提高效率。另外,我没有太多的索引表... :( – Ajit

+0

所以你检查你的每一个选择与解释?没有索引的查询也可能导致问题,也许你的问题是你的选择? 也myisam表将锁表写入时,innodb只锁定行,你的表的类型是什么? – tanaydin

+0

我的表是innodb类型 – Ajit

相关问题