2013-08-21 163 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

相關問題