Po prostu prosisz o dwie kolumny w zapytaniu, aby indeksy mogły/powinny się tam znaleźć:
- DataGodzina
- Czas wczytywania
Innym sposobem na przyspieszenie zapytania może być podzielenie pola DateTime na dwie części:datę i godzinę.
W ten sposób db może grupować bezpośrednio na polu daty zamiast obliczania DATE(...).
EDYTOWANO:
Jeśli wolisz używać wyzwalacza, utwórz nową kolumnę (DATE) i nazwij ją newdate i spróbuj z tym (nie mogę teraz sprawdzić, czy jest poprawne):
CREATE TRIGGER upd_check BEFORE INSERT ON SpeedMonitor
FOR EACH ROW
BEGIN
SET NEW.newdate=DATE(NEW.DateTime);
END
PONOWNIE EDYTOWANE:
Właśnie utworzyłem bazę danych z tą samą tabelą speedmonitor wypełnioną około 900 000 rekordów.
Następnie uruchamiam zapytanie SELECT newdate,AVG(LoadTime) loadtime FROM speedmonitor GROUP BY newdate i zajęło to około 100s!!
Usunięcie indeksu z pola newdate (i wyczyszczenie pamięci podręcznej za pomocą RESETUJ PAMIĘĆ PODRĘCZNĄ ZAPYTANIA
i STOŁY FLUSH
), to samo zapytanie zajęło 0,6 s!!!
Tylko dla porównania:zapytanie SELECT DATE(DateTime),AVG(LoadTime)loadtime FROM speedmonitor GROUP BY DATE(DateTime)
zajęło 0,9 s.
Przypuszczam więc, że indeks w dniu newdate nie jest dobry:usuń go.
Zamierzam dodać tyle rekordów, ile będę mógł teraz i ponownie przetestować dwa zapytania.
KOŃCOWA EDYCJA:
Usuwanie indeksów z kolumn newdate i DateTime zawierających 8 mln rekordów na stole speedmonitor, oto wyniki:
- wybieranie i grupowanie w kolumnie nowej daty:7,5 s
- wybieranie i grupowanie w polu DATE(DateTime):13,7 s
Myślę, że to dobre przyspieszenie.
Czas zajmuje wykonanie zapytania w wierszu poleceń mysql.