这是一个非常简单的MySQL存储过程。游标“委托(delegate)”只有 3000 条记录,但程序调用需要 30 多秒才能运行。这是为什么?
DELIMITER //
DROP PROCEDURE IF EXISTS apply_credit//
CREATE PROCEDURE apply_credit()
BEGIN
DECLARE done tinyint DEFAULT 0;
DECLARE _pk_id INT;
DECLARE _eid, _source VARCHAR(255);
DECLARE _lh_revenue, _acc_revenue, _project_carrier_expense, _carrier_lh, _carrier_acc, _gross_margin, _fsc_revenue, _revenue, _load_count DECIMAL;
DECLARE commission CURSOR FOR
SELECT pk_id, eid, source, lh_revenue, acc_revenue, project_carrier_expense, carrier_lh, carrier_acc, gross_margin, fsc_revenue, revenue, load_count FROM ct_sales_commission;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
DELETE FROM debug;
OPEN commission;
REPEAT
FETCH commission INTO
_pk_id, _eid, _source, _lh_revenue, _acc_revenue, _project_carrier_expense, _carrier_lh, _carrier_acc, _gross_margin, _fsc_revenue, _revenue, _load_count;
INSERT INTO debug VALUES(concat('row ', _pk_id));
UNTIL done = 1 END REPEAT;
CLOSE commission;
END//
DELIMITER ;
CALL apply_credit();
SELECT * FROM debug;
最佳答案
如果你选择一些数据,插入到另一个表中,你可以这样做:
INSERT INTO debug
SELECT concat('row ', _pk_id)
FROM ct_sales_commission;
它比使用游标更快。
一些小转弯:
删除表上的所有索引
debug
。将
DELETE FROM
替换为TRUNCATE TABLE
。在插入语句中添加
DELAYED
。INSERT DELAYED INTO ... VALUES(....)
关于mysql - 为什么这个简单的 MySQL 过程需要很长时间才能完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12362335/