sql >> Databáze >  >> RDS >> Mysql

Více MYSQL dotazů do vícesloupcové tabulky

Dobře, zdá se, že optimalizátor dotazů má nějaké problémy s mou předchozí odpovědí s velkými tabulkami. Zkuste místo toho toto řešení, funguje se závislými poddotazy:

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

Nastavil jsem tři tabulky s asi 800 000 řádky testovacích dat, každou. Na MySQL 5.5.30 se výše uvedený dotaz spustí přibližně za 3,5 sekundy a vrátí 61 řádků výsledků. Ale bezpodmínečně musíte mít indexy v každém časovém sloupci:

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

Jinak se dotaz neukončí. Věřím, že žádný dotaz zpracovávající toto množství dat nebude.



  1. Jak rozdělím řetězec, abych měl přístup k položce x?

  2. Existuje způsob, jak zobrazit klauzuli WHERE pouze pro jedno pole v MySQL?

  3. Entity Framework:mapujte varchar na vlastnost DateTime

  4. MySQL:Přetypování NULL na 0