Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Mehrere MYSQL-Abfragen in eine Tabelle mit mehreren Spalten

Ok, der Abfrageoptimierer scheint einige Probleme mit meiner vorherigen Antwort mit großen Tabellen zu haben. Versuchen Sie stattdessen diese Lösung, sie funktioniert mit abhängigen Unterabfragen:

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

Ich habe die drei Tabellen mit jeweils etwa 800.000 Zeilen Testdaten eingerichtet. Unter MySQL 5.5.30 läuft die obige Abfrage in etwa 3,5 Sekunden und gibt 61 Ergebniszeilen zurück. Aber Sie müssen unbedingt Indizes für jede der Zeitspalten haben:

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

Andernfalls wird die Abfrage nicht beendet. Ich glaube, dass keine Abfrage mit dieser Datenmenge umgehen kann.