mysql存储过程慢可能需要准备语句

mysql存储过程慢可能需要准备语句,mysql,stored-procedures,prepared-statement,insert-update,Mysql,Stored Procedures,Prepared Statement,Insert Update,数据通过一组csv文件中的zip文件输入,这些文件用于填充保留表。有些可以包括新数据或现有条目的更新。保留表用于中间处理,然后用于导入到工作表 为了加快进程,我一直在编写存储过程来更新工作表。在我的笔记本电脑上,一个只有730条记录的文件需要大约一分钟才能完成它的工作 我确实考虑过要做“插入”。在SP中的一个准备好的语句中添加“复制密钥更新”,但其他一些表有更多的字段,我找不到关于如何编写如此复杂的字段的好指南 以下是我的存储过程: DROP PROCEDURE IF EXISTS impLuR

数据通过一组csv文件中的zip文件输入,这些文件用于填充保留表。有些可以包括新数据或现有条目的更新。保留表用于中间处理,然后用于导入到工作表

为了加快进程,我一直在编写存储过程来更新工作表。在我的笔记本电脑上,一个只有730条记录的文件需要大约一分钟才能完成它的工作

我确实考虑过要做“插入”。在SP中的一个准备好的语句中添加“复制密钥更新”,但其他一些表有更多的字段,我找不到关于如何编写如此复杂的字段的好指南

以下是我的存储过程:

DROP PROCEDURE IF EXISTS impLuRacodes;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE impLuRacodes()  
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE v_ATID varchar(10);
DECLARE v_Code varchar(10);
DECLARE v_IssType varchar(10);
DECLARE v_Category varchar(10);
DECLARE v_CNumber int(4);
DECLARE v_CDesc varchar(255);
DECLARE v_ColCode varchar(6);
DECLARE v_LLike int(3);
DECLARE v_LifeS int(3);
DECLARE v_PropS int(3);
DECLARE v_BusS int(3);
DECLARE c_1 CURSOR FOR 
     SELECT `ATID`, `Code`, `IssType`, `Category`, `CNumber`, `CDesc`, `ColCode`, `LLike`, `LifeS`, `PropS`, `BusS` 
     FROM lu_racodes_temp;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
OPEN c_1;
REPEAT
   FETCH c_1 INTO v_ATID, v_Code, v_IssType, v_Category, v_CNumber, 
                  v_CDesc, v_ColCode, v_LLike, v_LifeS, v_PropS, v_BusS;
   INSERT INTO lu_racodes  (ATID, `Code`, IssType, Category, CNumber, 
               CDesc, ColCode, LLike, LifeS, PropS, BusS) 
   VALUES(v_ATID, v_Code, v_IssType, v_Category, v_CNumber, v_CDesc, 
          v_ColCode, v_LLike, v_LifeS, v_PropS, v_BusS) 
   ON DUPLICATE KEY UPDATE 
          ATID= v_ATID, `Code`= v_Code, IssType= v_IssType, Category= v_Category, 
          CNumber= v_CNumber, CDesc= v_CDesc, ColCode= v_ColCode, LLike=v_LLike, 
          LifeS= v_LifeS, PropS= v_PropS, BusS= v_BusS;
UNTIL done END REPEAT; 
CLOSE c_1;
END $$
或者,是否可以将选择放在“插入…”中。。。在“复制键”上,而不是使用光标——同样,我也不喜欢找到一个清晰的答案

多亏了指导,我重新编写了代码,将select放入其中,对于第一次填充,执行时间降至0.156秒。我关心的是update部分的语法以及对值的引用,因为它是一个Select语句,引入了数据,但是更改了源表中的几行确实得到了更新,并且仍然只有0.235秒的时间。下面是代码:

DROP PROCEDURE IF EXISTS impLuRacodes;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE impLuRacodes()  
BEGIN
INSERT INTO lu_racodes  (`ATID`, `Code`, `IssType`, `Category`, `CNumber`, `CDesc`, `ColCode`, `LLike`, `LifeS`, `PropS`, `BusS`) SELECT `ATID`, `Code`, `IssType`, `Category`, `CNumber`, `CDesc`, `ColCode`, `LLike`, `LifeS`, `PropS`, `BusS` FROM lu_racodes_temp ON DUPLICATE KEY UPDATE `ATID`= VALUES(`ATID`), `Code`= VALUES(`Code`), `IssType`= VALUES(`IssType`), `Category`= VALUES(`Category`), `CNumber`= VALUES(`CNumber`), `CDesc`= VALUES(`CDesc`), `ColCode`= VALUES(`ColCode`), `LLike`= VALUES(`LLike`), `LifeS`= VALUES(`LifeS`), `PropS`= VALUES(`PropS`), `BusS`= VALUES(`BusS`);
END
$$
DELIMITER ;

正如您所建议的,使用
INSERT。。。在重复密钥更新时
更有效。在Mysql中,游标通常是错误的答案。向我们展示您迄今为止使用INSERT ON DUPLICATE所做的尝试。Mikpa,在这种情况下,光标有什么问题?我可以想象它占用了大量资源,但这是否意味着插入正在被重复解析?对于这两个响应,在显示的代码中已经使用了insert on duplicate,并且索引已经就位,以便键工作
insert。。。重复键上选择
是有效的构造。请参阅:是否在目标表上创建了任何唯一索引?如果否,则重复密钥更新上的
无效。目标表上有一个唯一的密钥