如何在mysql程序中减少处理数据的时间

时间:2013-10-09 11:30:37

标签: mysql performance stored-procedures macros

谢谢论坛......请帮帮我.. 我有一个包含TagName的表,其他表包含taglog .im将标记名传递给名为GetAvg的过程,该过程将返回所有tags的avg。它运行良好,但显示100个标记值需要大约35秒。以减少时间。帮我新数据库。

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `GetAvg`(IN FromTime datetime, IN ToTime   datetime)
BEGIN
DECLARE  no_more_alarms INT DEFAULT 0;
DECLARE  TempTagName VARCHAR(45);
DECLARE  val FLOAT;
DECLARE  cur_tag CURSOR FOR
      select Tag_AVG from Report
      where(Tag_AVG IS NOT NULL );
      DECLARE  CONTINUE HANDLER FOR NOT FOUND
      SET  no_more_alarms = 1;


DROP TABLE IF EXISTS `tempAVG`;

CREATE  TABLE tempAVG (
val FLOAT
);


OPEN  cur_tag;

FETCH  cur_tag INTO TempTagName;
REPEAT

SELECT AVG(value) INTO val
FROM jas_taglog
WHERE ((TagId = (select TagId from jas_tags where jas_tags.Name = TempTagName)) AND jas_taglog.LogTime between FromTime and ToTime) ;

INSERT  INTO tempAvg(Val)
VALUES  (val);

FETCH cur_tag INTO TempTagName;
UNTIL  no_more_alarms = 1
END REPEAT;
CLOSE  cur_tag;
SELECT *  FROM tempAVG;

END

1 个答案:

答案 0 :(得分:0)

您正在手动实现可以在单个查询中编写的循环:

...
BEGIN
    INSERT  INTO tempAvg
    SELECT AVG(jas_taglog.value)
    FROM jas_taglog
    JOIN jas_tags USING (TagId)
    JOIN Report ON jas_tags.Name = Tag_AVG
    WHERE jas_taglog.LogTime BETWEEN FromTime AND ToTime
    GROUP BY Tag_AVG;
END