我在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。但问题仍然存在。