sql >> Database teknologi >  >> RDS >> Mysql

Flere MYSQL-forespørgsler i tabel med flere kolonner

Ok, forespørgselsoptimeringsværktøjet ser ud til at have nogle problemer med mit tidligere svar med store tabeller. Prøv denne løsning i stedet, den virker med afhængige underforespørgsler:

SELECT DATE_FORMAT(timeTable.minuteTime, '%Y-%m-%d %k:%i') time,
T2.temp temp,
S2.solids solids,
P2.Ph Ph
FROM
(
    SELECT minuteTime.minuteTime minuteTime,
    ( SELECT MAX(time) FROM temperature WHERE time <= minuteTime.minuteTime AND time >= NOW() - INTERVAL 1 HOUR) tempTime, 
    ( SELECT MAX(time) FROM ph WHERE time <= minuteTime.minuteTime AND time >= NOW() - INTERVAL 1 HOUR) phTime,  
    ( SELECT MAX(time) FROM solids WHERE time <= minuteTime.minuteTime AND time >= NOW() - INTERVAL 1 HOUR) solidsTime
    FROM  
    (
        SELECT time + INTERVAL 59 - SECOND( time ) SECOND minuteTime
        FROM Ph
        WHERE time >= NOW() - INTERVAL 1 HOUR AND time <= NOW()
        UNION SELECT time + INTERVAL 59 - SECOND( time ) SECOND
        FROM solids
        WHERE time >= NOW() - INTERVAL 1 HOUR AND time <= NOW()
        UNION SELECT time + INTERVAL 59 - SECOND( time ) SECOND
        FROM temperature
        WHERE time >= NOW() - INTERVAL 1 HOUR AND time <= NOW()
        GROUP BY 1
    ) minuteTime
) timeTable
LEFT JOIN temperature T2 ON T2.time = timeTable.tempTime
LEFT JOIN solids S2 ON S2.time = timeTable.solidsTime
LEFT JOIN ph P2 ON P2.time = timeTable.phTime
ORDER BY minuteTime ASC

Jeg har sat de tre tabeller op med omkring 800.000 rækker af testdata, hver. På MySQL 5.5.30 kører forespørgslen ovenfor på cirka 3,5 sekunder og returnerer 61 resultatrækker. Men du skal absolut have indekser på hver af tidskolonnerne:

ALTER TABLE `ph` ADD INDEX ( `time` ) ;
ALTER TABLE `solids` ADD INDEX ( `time` ) ;
ALTER TABLE `temperature` ADD INDEX ( `time` ) ;

Ellers afsluttes forespørgslen ikke. Jeg tror, ​​at ingen forespørgsler, der håndterer denne mængde data, vil gøre det.



  1. Sammenligning af datatyper for dato og klokkeslæt i SQL Server

  2. Mysql 'Fik fejl -1 fra lagermotor' fejl

  3. Sådan redigeres linkede serverindstillinger ved hjælp af T-SQL

  4. MySQL-forespørgsel til at tælle varer efter uge i de nuværende 52 uger?