Mysql存储过程太慢了

时间:2013-06-12 13:58:05

标签: mysql sql database stored-procedures

我在sql中编写了一个存储过程非常慢。数据库中有数百万条记录。

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `FetchEnergyLine`(IN From_Time INT, IN
    To_Time INT, IN Meter_Id INT, IN Device_Id VARCHAR(10), IN ct INT)
BEGIN
DECLARE c INT(5) default 0;
DECLARE Count INT default 1;

SET autocommit=0; 
SET @c=0;
SET Count = (SELECT COUNT(TimeStamp) FROM Meter_Data
WHERE 
    TimeStamp > From_Time
    AND TimeStamp < To_Time 
    AND MeterID = Meter_Id 
    AND DeviceID = Device_Id );

IF Count > (2*ct) THEN SET Count=Count/ct;
ELSE SET COUNT = 20;
END IF;

SELECT * FROM ( SELECT TimeStamp, FwdHr, W , @c:=@c+1  as counter
FROM 
    Meter_Data
WHERE 
    TimeStamp > From_Time
    AND TimeStamp < To_Time 
    AND MeterID = Meter_Id 
    AND DeviceID = Device_Id ORDER BY TimeStamp
) as tmp
WHERE
counter % Count =1; 
END

我认为当我的数据较少时,速度非常快,但我使用相同数据库的其他查询运行正常,但存储过程很慢。 1)它可以是count语句,它在开始时计算读数,但我不太确定。

任何人都可以帮忙吗?提前谢谢..

1 个答案:

答案 0 :(得分:0)

在构建查询后,我要做的第一件事是确保我没有忘记任何事情。 (索引,临时表,密钥等......)

初看起来,我猜你的计划中有一些表扫描可能需要80-90%的处理时间。
要确保不会发生这种情况,请在您查询的表中创建所需的indexes

为了确保没有任何内容太长,您应该学习如何使用execution plan并查看花费时间最长的内容。