如何在mysql中加速存储过程
下面给出的是我的过程需要花费太多的时间来执行如何在mysql中加速存储过程,mysql,stored-procedures,Mysql,Stored Procedures,下面给出的是我的过程需要花费太多的时间来执行 BEGIN DECLARE rank1 BIGINT DEFAULT 0; DECLARE id1 BIGINT; DECLARE rankskip BIGINT DEFAULT 0; DECLARE mark DECIMAL(10,2) DEFAULT 0; DECLARE oldmark DECIMAL(10,2) DEFAULT -100000; DECLARE done int DEFAULT
BEGIN
DECLARE rank1 BIGINT DEFAULT 0;
DECLARE id1 BIGINT;
DECLARE rankskip BIGINT DEFAULT 0;
DECLARE mark DECIMAL(10,2) DEFAULT 0;
DECLARE oldmark DECIMAL(10,2) DEFAULT -100000;
DECLARE done int DEFAULT 0;
DECLARE cursor_i CURSOR FOR
SELECT
(rightmarks - negativemarks) as mark, id
FROM
testresult
WHERE
testid = testid1
ORDER BY
(rightmarks - negativemarks) DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cursor_i;
read_loop: LOOP
FETCH cursor_i INTO mark, id1;
IF done = 1 THEN
LEAVE read_loop;
END IF;
IF oldmark = mark THEN
BEGIN
IF IsRankSkip = 1 THEN
BEGIN
SET rankskip = rankskip + 1;
END;
END IF;
END;
ELSE
BEGIN
SET rank1 = rank1 + rankskip + 1;
SET rankskip = 0;
END;
END IF;
SET oldmark = mark;
UPDATE testresult SET rank = rank1 WHERE id=id1;
END LOOP;
CLOSE cursor_i;
END
此循环至少迭代2000次
这里IsRankSkip和testid1是传递给过程的参数
执行此过程需要65.343152046204时间。如果有人指导我如何减少执行时间
提前感谢。您可以使用一条
update
语句,利用在执行过程中更改的变量来完成此操作:
UPDATE testresult a
JOIN ( SELECT id,
@row := @row + 1 row_number,
@rank := if(mark = @lastmark, @rank, @row) as rank,
@dense_rank := @dense_rank + if(mark = @lastmark, 0, 1) as dense_rank,
@lastmark := mark as mark
FROM ( SELECT rightmarks - negativemarks as mark,
id
FROM testresult
WHERE testid = testid1
ORDER BY 1 DESC
) data,
(SELECT @row := 0, @dense_rank := 0) r
) b
ON a.id = b.id
SET a.rank = if(IsRankSkip, b.rank, b.dense_rank);
别名为b
的查询计算排名并将其作为列添加到结果集中。事实上,它增加了三种数字:
:未经特殊处理的等额连续行号@row
:值的行号与前一行不同,否则与前一行相同@rank
:当值与前一行中的值不同时,该值将递增,否则与前一行中的值相同@densite\u rank
如果您总是为所有testid值调用您的过程,那么上面的内容可以进一步改进,因此所有这些更新只需一条
update
语句即可完成 很可能您不需要存储过程。请解释你想做什么。提供示例数据并显示create table Output抱歉无法创建。至少在你提供我在第一次评论中要求的附加信息之前,我会尝试向你解释整个流程。我有一个名为resulttrigger的表。在该表中插入数据时,触发器将触发,从而更新其表中的学生排名。该触发器包含两个过程,上面给出了其中一个过程。你能告诉我什么时候触发php代码等待一段时间,直到触发器完成它的工作,在代码执行开始后,或者在触发器触发php代码和触发器后,两者并行工作吗?你的答案对我来说是最重要的。。。非常感谢。