加快sproc的插入

时间:2012-10-10 12:53:33

标签: mysql

这个问题与:

有关

SO question

它使用此代码:

CREATE PROCEDURE myProc(IN t1 timestamp, IN t2 timestamp)
BEGIN

  WHILE t1 <= t2 DO
INSERT INTO test (ts) Values (t1)  ;
    SET t1 = DATE_ADD(t1, INTERVAL 3 MINUTE);
  END WHILE;
END;

这样调用:

CALL myProc(now(), ADDDATE(NOW(), INTERVAL 15 MINUTE));

非常慢。有没有办法加快速度(例如以不同的方式做事)?

2 个答案:

答案 0 :(得分:1)

我认为在交易中包装它会改善事情......就像:

CREATE PROCEDURE myProc(IN t1 timestamp, IN t2 timestamp)
BEGIN

DECLARE EXIT HANDLER FOR SQLEXCEPTION 
BEGIN
      ROLLBACK;
END;

START TRANSACTION;

   WHILE t1 <= t2 DO
      INSERT INTO test (ts) Values (t1)  ;
      SET t1 = DATE_ADD(t1, INTERVAL 3 MINUTE);
   END WHILE;

COMMIT;

END

我只是将它们放在一起并且没有测试过,但我认为这可能有所帮助。

答案 1 :(得分:1)

我认为你可以通过使用临时表来加速你的程序。 这是计划:

  • 创建tmp表
  • 使用要插入的数据填充tmp表
  • 执行需要磁盘写入/索引重建的一个 INSERT查询
某些人喜欢这样:

CREATE PROCEDURE myProc(IN t1 timestamp, IN t2 timestamp)
BEGIN
  CREATE TEMPORARY TABLE tmp (ts timestamp);
  WHILE t1 <= t2 DO
    INSERT INTO tmp SET ts = t1;
    SET t1 = DATE_ADD(t1, INTERVAL 3 MINUTE);
  END WHILE;
  INSERT INTO test (ts) SELECT ts FROM tmp;
  DROP TABLE tmp;
END;