2011-08-29 134 views
0

激起许多事情值得尝试优化一个MySQL查询连接7台时?MySQL查询优化

select trips.tripid as tripid 
    , stops.stopdescrption as "perron" 
    , DATE_FORMAT(segments.segmentstart, "%H:%i") as "time" 
    , DATE_FORMAT(trips.tripend, "%H:%i") as "arrival" 
    , UPPER(routes.routepublicidentifier) as "lijn" 
    , plcend.placedescrption as "destination" 
from calendar 
       join trips on calendar.vsid=trips.vsid 
       join routes on routes.routeid=trips.routeid 
       join places plcstart on plcstart.placeid=trips.placeidstart 
       join places plcend on plcend.placeid=trips.placeidend 
       join segments on segments.tripid = trips.tripid 
       join stops on segments.stopid = stops.stopid 
where (stops.stopid = :perrons0 
    OR stops.stopid = :perrons1 OR stops.stopid = :perrons2 
    OR stops.stopid = :perrons3 OR stops.stopid = :perrons4 
    OR stops.stopid = :perrons5 OR stops.stopid = :perrons6 
    OR stops.stopid = :perrons7 OR stops.stopid = :perrons8 
    OR stops.stopid = :perrons9 OR stops.stopid = :perrons10 
    OR stops.stopid = :perrons11 OR stops.stopid = :perrons12 
    OR stops.stopid = :perrons13 OR stops.stopid = :perrons14 
    ) 
    AND calendar.vscdate = DATE(DATE_ADD(now(), INTERVAL "07:00" HOUR_MINUTE)) 
    AND segments.segmentstart >= TIME(DATE_ADD(now(), INTERVAL "07:00" HOUR_MINUTE)) 
    AND routes.routeservicetype = 0 
    AND segments.segmentstart > "00:00:00" 
ORDER BY segments.segmentstart 

有查询,我似乎无法想到的任何事情去改变那将优化这...这超时....

任何提示的欢迎!

+1

你有什么指标? –

+0

'EXPLAIN'计划展示了什么? –

回答

1

怎么样使用IN关键字,而不是多个OR的。此外,你不需要指定AND segments.segmentstart > "00:00:00"因为你已经提供了条件segments.segmentstart >= TIME(DATE_ADD(now(), INTERVAL "07:00" HOUR_MINUTE))是大于"00:00:00"。最后,索引你的密钥是优化执行的好主意。

select trips.tripid as tripid 
, stops.stopdescrption as "perron" 
, DATE_FORMAT(segments.segmentstart, "%H:%i") as "time" 
, DATE_FORMAT(trips.tripend, "%H:%i") as "arrival" 
, UPPER(routes.routepublicidentifier) as "lijn" 
, plcend.placedescrption as "destination" 
from calendar 
      join trips on calendar.vsid=trips.vsid 
      join routes on routes.routeid=trips.routeid 
      join places plcstart on plcstart.placeid=trips.placeidstart 
      join places plcend on plcend.placeid=trips.placeidend 
      join segments on segments.tripid = trips.tripid 
      join stops on segments.stopid = stops.stopid 
where stops.stopid IN (:perrons0, 
:perrons1,:perrons2, 
:perrons3, :perrons4, 
:perrons5, :perrons6, 
:perrons7,:perrons8, 
:perrons9, :perrons10, 
:perrons11, :perrons12, 
:perrons13, :perrons14 
) 
AND calendar.vscdate = DATE(DATE_ADD(now(), INTERVAL "07:00" HOUR_MINUTE)) 
AND segments.segmentstart >= TIME(DATE_ADD(now(), INTERVAL "07:00" HOUR_MINUTE)) 
AND routes.routeservicetype = 0 

ORDER BY segments.segmentstart 
+0

哇这个伎俩,但我以前试过,它只是不断加载...一定是一个服务器错误! – Mars

+0

@mars我很高兴我可以帮助:D – reggie