【问题标题】:MYSQL Slow store INSERTMYSQL 慢存储 INSERT
【发布时间】:2020-10-08 21:43:20
【问题描述】:

我正在将 MSSQL DB 迁移到 MySQL。而且我有一个 SP 可以在表中插入很多内容,它的工作正常 y mssql 但 Mysql 中的相同过程需要太多时间。我读到,使许多插入不是执行得更快的东西。

它是一个在每个循环中进行插入的while循环。

我想知道您是否有更快的方法来做到这一点?

例如,当我在 python 中执行此操作时,我将选择添加到列表中,并在循环结束时只插入所有行。我试图弄清楚如何在 mysql SP 中执行此操作。

这是SP,但我不能把我调用的所有表都放在这里。

CREATE DEFINER=`root`@`localhost` PROCEDURE `SP_indisp_cscs3`()
BEGIN
                                                            /*BORRA LA INFORMACION A SER REPROCESADA*/
    DELETE FROM indisp;
    /*WHERE mes = MONTH(CURDATE())
    AND año = YEAR(CURDATE());*/
                                                        /*Comienza la fiesta, se armó la culiandanga*/
                                                        
    SET @row  = (SELECT min(cscsID) from cscs where month(inicio) = month(curdate()) AND YEAR(inicio) = YEAR(curdate()));
    WHILE  @row <= (SELECT max(cscsID) from cscs ) DO
        SET @inicio = (SELECT inicio FROM cscs WHERE cscsid = @row); 
        SET @fin = (select   fin from cscs where cscsid = @row); 
        SET @hourini = @inicio;
        SET @compID = (select compID from cscs where cscsid = @row);
        SET @vencomp = (select ven_comp from cscs where cscsid = @row);
        SET @venserv = (select ven_serv from cscs where cscsid = @row);
            
        WHILE @inicio < @fin AND  MONTH(@inicio) = MONTH(CURDATE()) AND YEAR(@inicio) = YEAR(CURDATE()) DO
            
            INSERT INTO indisp (ticketid)/*, diasem, splitdate, año,mes, hour,affected, compID, serv_pais_prodID, ven_comp,ven_serv)*/
            VALUES (
                    (select ticketid from cscs where cscsid = @row)/*,
                    DAYOFWEEK(@inicio),
                    @inicio,
                    year(@inicio),
                    month(@inicio),
                    @hourini,
                    1,
                    @compID,
                    (select serv_pais_prodID from cscs where cscsID = @row),
                    (select CASE
                        WHEN @vencomp = 1 THEN  (select venx  from  ven1  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @vencomp = 2 THEN  (select venx  from  ven2  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @vencomp = 3 THEN  (select venx  from  ven3  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @vencomp = 4 THEN  (select venx  from  ven4  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @vencomp = 5 THEN  (select venx  from  ven5  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @vencomp = 6 THEN  (select venx  from  ven6  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @vencomp = 7 THEN  (select venx  from  ven7  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @vencomp = 8 THEN  (select venx  from  ven8  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @vencomp = 9 THEN  (select venx  from  ven9  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @vencomp = 10 THEN  (select venx  from  ven10  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @vencomp = 11 THEN  (select venx  from  ven11  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @vencomp = 12 THEN  (select venx  from  ven12  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @vencomp = 13 THEN  (select venx  from  ven13  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        ELSE 0
                    END),
                                        (select CASE
                        WHEN @venserv = 1 THEN  (select venx  from  ven1  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @venserv = 2 THEN  (select venx  from  ven2  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @venserv = 3 THEN  (select venx  from  ven3  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @venserv = 4 THEN  (select venx  from  ven4  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @venserv = 5 THEN  (select venx  from  ven5  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @venserv = 6 THEN  (select venx  from  ven6  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @venserv = 7 THEN  (select venx  from  ven7  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @venserv = 8 THEN  (select venx  from  ven8  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @venserv = 9 THEN  (select venx  from  ven9  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @venserv = 10 THEN  (select venx  from  ven10  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @venserv = 11 THEN  (select venx  from  ven11  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @venserv = 12 THEN  (select venx  from  ven12  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        WHEN @venserv = 13 THEN  (select venx  from  ven13  WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
                        ELSE 0
                    END)  */               
                    );
    
                    
            SET @inicio =  @inicio + INTERVAL 1 MINUTE;
        END WHILE;
        
        SET @row = @row +1;
    END WHILE;
    UPDATE indisp
    SET ven_serv = 0
    WHERE ven_serv IS NULL;
   
END

【问题讨论】:

    标签: mysql performance loops insert


    【解决方案1】:

    为自己建立一个日期表。然后 LEFT JOIN 将该表添加到您的其他数据中。

    日期表的一次性设置将涉及循环(或交叉连接或整数表或 MariaDB seq 表)。

    那么JOIN 会非常有效;可能比你在 MSSql 中的效率更高。不会有循环,只有JOIN。如果您需要为假期等创建行,则可能是LEFT JOIN

    【讨论】:

      猜你喜欢
      • 2013-09-22
      • 1970-01-01
      • 2020-06-07
      • 2014-08-17
      • 1970-01-01
      • 2016-08-30
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多