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

时间:2012-09-11 03:27:54

标签: mysql database

这是一个非常简单的MySQL存储过程。光标“委托”只有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;

2 个答案:

答案 0 :(得分:1)

如果选择一些数据并插入另一个表,则可以执行以下操作:

INSERT INTO debug 
SELECT concat('row ', _pk_id)
FROM ct_sales_commission;

它比使用光标更快。


一些小转向:

  • 删除表debug上的所有索引。

  • DELETE FROM替换为TRUNCATE TABLE

  • DELAYED添加到insert语句。

    INSERT DELAYED INTO ... VALUES(....)
    

答案 1 :(得分:0)

数据库托管在离我的MySQL客户端很远的数据中心。

连接到与MySQL服务器紧密相连的MySQL客户端,使执行时间快了近60倍(完成该过程所需的时间不到一秒)。

我怀疑MySQL客户端CLI在处理类似的远程数据连接时存在问题。