如何解决MYSQL慢速存储INSERT
我正在将MSSQL DB迁移到MySQL。而且我有一个SP,可以在一个表中进行很多插入,它可以正常工作,但在Mysql中执行相同的过程会花费太多时间。我读到要插入很多东西并不能提高执行速度。
它的while循环在每个循环中进行插入。
我想知道您是否有更快的方法?
例如,当我在python中执行此操作时,我将ever select添加到列表中,并且在循环结束时,我仅插入了所有行的一个。我试图弄清楚如何在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
解决方法
为自己建立一个日期表。然后LEFT JOIN
将该表添加到您的其他数据。
一次性设置日期表会涉及一个循环(或交叉连接或整数表或MariaDB seq表)。
然后JOIN
将非常有效;可能比您在MSSql中更有效。没有循环,只有JOIN
。如果您甚至需要在假期等期间创建行,则可能是LEFT JOIN
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。