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

Langsame MySQL-Abfrage

Sie fragen nur nach zwei Spalten in Ihrer Abfrage, also könnten/sollten Indizes dorthin gehen:

  • DatumUhrzeit
  • Ladezeit

Eine andere Möglichkeit, Ihre Abfrage zu beschleunigen, könnte das DateTime-Feld in zwei Teile aufteilen:Datum und Uhrzeit.
Auf diese Weise kann db direkt nach Datumsfeldern gruppieren, anstatt DATE(...) zu berechnen.

BEARBEITET:
Wenn Sie lieber einen Trigger verwenden, erstellen Sie eine neue Spalte (DATE) und nennen Sie sie newdate , und versuchen Sie es damit (ich kann es jetzt nicht ausprobieren, um zu sehen, ob es richtig ist):

CREATE TRIGGER upd_check BEFORE INSERT ON SpeedMonitor
FOR EACH ROW
BEGIN
  SET NEW.newdate=DATE(NEW.DateTime);
END

ERNEUT BEARBEITET:
Ich habe gerade eine Datenbank mit der gleichen Tabelle Speedmonitor erstellt, die mit etwa 900.000 Datensätzen gefüllt ist.
Dann führe ich die Abfrage SELECT newdate,AVG(LoadTime) loadtime FROM speedmonitor GROUP BY newdate und es hat ungefähr 100 Sekunden gedauert!!
Entfernen des Index auf dem neuen Datumsfeld (und Leeren des Caches mit RESET QUERY CACHE und FLUSH TABLES ), die gleiche Abfrage dauerte 0,6 Sekunden!!!
Nur zum Vergleich:Abfrage SELECT DATE(DateTime),AVG(LoadTime) loadtime FROM speedmonitor GROUP BY DATE(DateTime) hat 0,9 Sekunden gedauert.
Also nehme ich an, dass der Index auf newdate nicht gut ist:Entfernen Sie ihn.
Ich werde jetzt so viele Datensätze wie möglich hinzufügen und zwei Abfragen erneut testen.

SCHLUSSBEARBEITUNG:
Entfernen von Indizes für newdate- und DateTime-Spalten mit 8 Millionen Datensätzen Auf der Speedmonitor-Tabelle sind hier die Ergebnisse:

  • Auswählen und Gruppieren in Spalte newdate:7,5 s
  • Auswahl und Gruppierung im DATE(DateTime)-Feld:13,7 s

Ich denke, es ist eine gute Beschleunigung.
Die Ausführung von Abfragen in der mysql-Eingabeaufforderung nimmt Zeit in Anspruch.