2014-12-19 149 views
0

我使用下面的查询在MySQL中COUNT记录和显示记录。虽然它显示正常并且正常工作,但它非常缓慢。我认为这部分是由于HTG_ScheduleRequest表非常大。有没有更好的方式来安排这个查询来加快速度?慢MySQL查询JOIN

SELECT HTG_TechProps.EmpNumber, 
     HTG_TechProps.EmpFirstName, 
     HTG_TechProps.EmpLastName, 
     HTG_TechProps.Veh_Number, 
     COUNT(HTG_ScheduleRequest.ID) AS current_job 
    FROM HTG_TechProps 
     LEFT JOIN HTG_ScheduleRequest 
      ON HTG_TechProps.EmpNumber = HTG_ScheduleRequest.SSR 
       AND (HTG_ScheduleRequest.ScheduleDateCurrent = CURDATE()) 
       AND HTG_ScheduleRequest.JobStatus = '3' 
    GROUP BY HTG_TechProps.EmpNumber 
    ORDER BY HTG_TechProps.EmpNumber ASC 
+0

不知道。你还没有提供关于你的数据库的任何结构细节。但作为一般的经验法则:“决定”上下文(where,join,sort,group)中使用的任何字段都应该有一个索引。 –

+0

请在这里发布两个表格的'SHOW CREATE TABLE tabname'输出。索引将是重要的。 –

+1

有时,它帮助先做聚合(查询优化器应该这样做,但他们并不总是做:)替换为HTG_ScheduleRequest(选择SSR,从HTG_Schedule_request其中(HTG_ScheduleRequest.ScheduleDateCurrent = CURDATE())和HTG_ScheduleRequest COUNT(*) .JobStatus ='3') – okaram

回答

2

假设EmpNumber是独一无二的,试试这个版本(索引按照查询):

SELECT tp.EmpNumber, tp.EmpFirstName, tp.EmpLastName, tp.Veh_Number, 
     (SELECT COUNT(*) 
     FROM HTG_ScheduleRequest sr 
     WHERE tp.EmpNumber = sr.SSR AND 
       sr.ScheduleDateCurrent = CURDATE() AND 
       sr.JobStatus = '3' 
     ) 
FROM HTG_TechProps tp 
ORDER BY tp.EmpNumber ASC; 

运行查询之前,创建这些索引:HTG_TechProps(EmpNumber)HTG_ScheduleRequest(SSR, JobStatus, ScheduleDateCurrent)

+0

真棒,感谢Gordon的帮助! –