简体   繁体   中英

How can I improve the performance of this query?

SELECT
DATE(DTM) AS 'Dia',
ROUND(AVG(TMP)-10) AS 'Graus Dia',
(SELECT 
ROUND(AVG(TMP),1) 
FROM dados_meteo 
WHERE HOUR(DTM)>=18 AND HOUR(DTM)<=22 AND DATE(DTM)=Dia/* AND POM = '[VARIABLE]'*/) AS 'Temp. Crepuscular'
FROM dados_meteo
/*WHERE POM = '[VARIABLE]'*/
GROUP BY DATE(DTM)

The structure of the table is:

POM Varchar 
DTM datetime 
RNF double 
WET double 
HMD double 
TMP double 
DEW double 
INF int

And the output of explain select... is:

1 PRIMARY dados_meteo ALL NULL NULL NULL NULL 18684 Using where; Using temporary; Using filesort 
2 DEPENDENT SUBQUERY dados_meteo ALL NULL NULL NULL NULL 18684 Using where 

Split dtm up in a date and time part.

datem date
timem time

SELECT
  datem AS 'Dia'
  ,ROUND(AVG(TMP)-10) AS 'Graus Dia'
  ,(SELECT ROUND(AVG(TMP),1) 
     FROM dados_meteo 
     WHERE timem BETWEEN maketime(18,0,0) AND maketime(22,0,0) 
     AND datem = Dia) AS 'Temp. Crepuscular'
FROM dados_meteo
GROUP BY datem

Make sure you use an index on timem and datem

At least create an index for DTM .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM