mysql - 为什么这个简单的 MySQL 过程需要很长时间才能完成?

标签 mysql database

这是一个非常简单的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/

相关文章:

MySQL 存储过程不起作用

sql-server - 如何在事务期间检查 SQL Server 数据库?

sql - 从许多表中清除内容的最快方法

PHP 将行插入 MySQL - 哪种方法更合适?

python - 如何在 python 中用 MySQL 检索温度和日期时间绘制一条线

php - 选择不同的月份和年份,然后分割值

mysql - 如何使用池连接来连接表?

mysql - ORDER BY 百分比不起作用

mysql - [1、2、3] 岁与 1 岁和 3 岁之间的年龄

java - 加密一个字符串,将其保存到数据库,加载并解密