MySQL存储过程循环超时
我有一个名为MySQL存储过程循环超时,mysql,Mysql,我有一个名为maptable的表,如下所示: occ_id name position 0124 Mark Jones 2 Hanna Smith 3 Frank Williams 4 0238 Henry Bassett 5 我试图“填写”occ_id栏中缺失的部分(也就是说,汉娜·史密斯和弗兰克·威廉姆斯也应该有occ_id 0124)
maptable
的表,如下所示:
occ_id name position
0124 Mark Jones 2
Hanna Smith 3
Frank Williams 4
0238 Henry Bassett 5
我试图“填写”occ_id栏中缺失的部分(也就是说,汉娜·史密斯和弗兰克·威廉姆斯也应该有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
CREATE DEFINER=`root`@`localhost`过程`mapjoinid\u 1`()
修改SQL数据
开始
声明n INT默认值为0;
声明i INT默认值为0;
从occ_id=''的映射表中选择COUNT(*)到n;
设置i=0;
而我
更新映射表m JOIN映射表mt ON(m.position-1)=mt.position SET m.occ\U id=mt.occ\U id;
设置i=i+1;
结束时;
终点
是否有一种更有效的方法来循环或重复
update
语句,而该语句的处理时间不会太长?效率问题很可能来自while循环中的连接声明。MySQL并不特别擅长运行这些类型的函数,因此一种解决方法是在MySQL更新中执行嵌套选择:。如果您不打算重复运行此过程(就像存储过程一样),那么我认为这是最有效的操作过程
超时也可能来自变量声明:仔细检查所有变量是否递增并正确存储。我拼凑了来自不同来源的代码。你能给我举一个你所说的代码的例子吗?我遵循了您提供的链接,但它也使用了连接。