Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wiele zapytań MYSQL w tabeli z wieloma kolumnami

Ok, wydaje się, że optymalizator zapytań ma pewne problemy z moją poprzednią odpowiedzią dotyczącą dużych tabel. Zamiast tego wypróbuj to rozwiązanie, działa ono z podzapytaniami zależnymi:

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

Skonfigurowałem trzy tabele z około 800 000 wierszy danych testowych, każda. W MySQL 5.5.30 powyższe zapytanie działa w około 3,5 sekundy i zwraca 61 wierszy wyników. Ale absolutnie musisz mieć indeksy dla każdej kolumny czasu:

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

W przeciwnym razie zapytanie nie zostanie zakończone. Uważam, że żadne zapytanie obsługujące taką ilość danych nie będzie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Łączenie się z serwerem MySQL za pomocą C++

  2. mysql - przenieś wiersze z jednej tabeli do drugiej

  3. java.sql.SQLException:Po zakończeniu wyniku ustawionego w mysql

  4. Ostatnio wstawiony identyfikator MySQL PDO

  5. Jak utworzyć unikalny losowy identyfikator liczby całkowitej dla klucza podstawowego dla tabeli?