Mysql查询使用临时表减慢

时间:2014-09-02 13:06:28

标签: mysql

我在mysql中有两个数据库。 在一个我定期使用存储过程触发查询

CREATE TEMPORARY TABLE l_AVG_STD_tbl (
        ID BIGINT AUTO_INCREMENT PRIMARY KEY,
        BusStopID1 VARCHAR(30),
        BusStopID2 VARCHAR(30),
        SlotID INT (11),
        AVG_Time FLOAT ,
        STD_Time FLOAT ,
        VR_Time FLOAT
);
INSERT INTO l_AVG_STD_tbl
        (BusStopID1,
        BusStopID2 ,
        SlotID ,
        AVG_Time ,
        STD_Time ,
        VR_Time)

 SELECT BusStopId1 ,BusStopId2 ,SlotId ,AVG(TimeTaken) ,STD(TimeTaken), VARIANCE(TimeTaken)  FROM PastHistory
 GROUP BY BusStopId1 ,BusStopId2 , SlotId ;

*注意:table PastHistory包含大约400万行,其中包含BusStopId1,BusStopId2,SlotId,TimeTaken列的索引。 在另一个数据库中,我正在触发更新并在表格上选择查询,如:

update PIS_ETA_CURRENT set  ETA='eta',Destination='destinationName',Send_Flag=0,DBTimestamp= CURRENT_TIMESTAMP() where StoppageID='BusStopID' and BusRoute='routeNum' and VehicleNo='vehicleNo';

select t1.BusRoute,t1.Destination,t1.ETA,t1.Send_Flag,t1.DBTimestamp,ceil((t1.ETA - time_to_sec(timediff(NOW(), t1.DBTimestamp))/60)) as ExpectedETA 
from PIS_ETA_CURRENT t1
inner join
(
  select BusRoute,Destination,MIN(ETA) as MINETA from PIS_ETA_CURRENT 
  WHERE  
    StoppageID ='U02838'
    and (((ETA - time_to_sec(timediff(NOW(), DBTimestamp))/60) > 0) or Send_Flag = 0) 
    and ETA<=19 and ETA>=1 
    group by BusRoute,Destination
) t2
  on t1.BusRoute = t2.BusRoute
  and t1.Destination = t2.Destination
  and t1.ETA = t2.MINETA
 WHERE
    t1.StoppageID ='U02838' 
   and (((t1.ETA - time_to_sec(timediff(NOW(), t1.DBTimestamp))/60) > 0) or t1.Send_Flag = 0) 
   and t1.ETA<=19 and t1.ETA>=1 
 order by t1.Send_Flag, (t1.ETA - time_to_sec(timediff(NOW(), t1.DBTimestamp))/60) limit 10;

*注意:表PIS_ETA_CURRENT包含大约10万行,其中索引位于StoppageID,BusRoute,VehicleNo

所有表格都是MyISAM,因为它是遗留系统。我正在使用四核服务器和32G内存运行mysql 5.0。

系统工作正常,但是一旦第一个查询开始执行,接下来的两个查询就会减慢,甚至不在同一个数据库中。

在调试时我觉得这是因为第一个和第三个查询都创建了临时表。第一个在磁盘上,第二个在内存中。所以我增加了tmp_table_size = 64M max_heap_table_size = 32M的64M。但问题仍然存在。

0 个答案:

没有答案