MySQL存储过程循环超时

时间:2017-04-03 17:01:21

标签: mysql

我有一个名为maptable的表,如下所示:

occ_id     name               position
0124       Mark Jones         2
           Hanna Smith        3 
           Frank Williams     4
0238       Henry Bassett      5

我正在努力填写'缺少的occ_id列(意思是,Hanna Smith和Frank Williams也应该有occ_id 0124)。

我提出了以下程序来完成这项工作,但是有大约6000条记录,每次运行它都会超时:

CREATE DEFINER=`root`@`localhost` PROCEDURE `mapjoinid_1`()
MODIFIES SQL DATA
BEGIN
        DECLARE n INT DEFAULT 0;
        DECLARE i INT DEFAULT 0;
        SELECT COUNT(*) FROM maptable WHERE occ_id = '' INTO n;
        SET i=0;
                WHILE i < n DO
                UPDATE maptable m JOIN maptable mt ON (m.position - 1) = mt.position SET m.occ_id = mt.occ_id;
                SET i = i + 1;
                END WHILE;
        End

是否有一种更有效的方式来循环或重复update语句,它不会花费这么长时间来处理?

1 个答案:

答案 0 :(得分:0)

效率问题很可能来自于在while循环中声明Join。 MySQL在运行这些类型的函数方面并不是特别擅长,所以解决它的方法是在MySQL更新中进行嵌套选择:MySQL - UPDATE query based on SELECT Query。如果您不打算重复运行此过程(可能与存储过程一样),那么我认为这是最有效的操作过程。

超时也可能来自您的变量声明:仔细检查以查看所有变量的增量并正确存储。