Ich benutze die RDS-Datenbank von Amazon mit ein paar sehr großen Tabellen, und gestern begann ich mit 100% CPU-Auslastung auf dem Server und einer Reihe von langsamen Abfrageprotokollen, die vorher nicht stattfanden.
Ich habe versucht, die ausgeführten Abfragen zu überprüfen und mit dem explain-Befehl
konfrontiert %Vor%Auch beim Einchecken in die Prozessliste habe ich so etwas bekommen:
%Vor%Aufgrund der Zahlen scheint es also keinen Grund für eine langsame Abfrage zu geben, da der schlechteste Ausführungsplan derjenige ist, der 2k Zeilen durchläuft, was nicht viel ist.
Bearbeiten 1
Eine weitere nützliche Information ist das langsame query_log
%Vor%Bearbeiten 2
Nach dem Profiling habe ich dieses Ergebnis erhalten. Das Ergebnis hat ungefähr 250 Zeilen mit jeweils zwei Spalten.
%Vor%Bearbeiten Sie 3
Abfrage wie gewünscht hinzufügen
%Vor%Bearbeiten 4
Es besteht die Möglichkeit, dass die Indizes aufgrund des Unterschieds im Spaltentyp zwischen den Markierungen und den activities_businesses in der Spalte taggable_id nicht angewendet werden.
%Vor%Es untersucht also mehr Zeilen als in der EXPLAIN-Abfrage angezeigt wird, wahrscheinlich weil einige Indizes nicht angewendet werden.
Könnt ihr mir dabei helfen?
Wie ich bei der 4. Bearbeitung erwartet hatte, gab es eine irreführende Information, die MySQL mit dem DESCRIBE
-Befehl lieferte.
Auch wenn der Ausführungsplan, der durch den Befehl bereitgestellt wurde, aussagte, dass es wie folgt aussehen würde:
%Vor%Das war natürlich nicht das, was passierte, denn in der langsamen Abfrage konnten wir sehen, dass die Anzahl der untersuchten Zeilen viel größer war.
%Vor%Mit diesen Informationen war es möglich, die Joins zu überprüfen und festzustellen, dass die IDs in den Tabellen nicht den gleichen Typ verwendeten:
%Vor% Wenn wir ein wenig über das Thema recherchierten, war es leicht zu sagen, dass MySQL keine Spalten unterschiedlicher Typen oder zumindest nicht richtig indiziert, obwohl der Befehl EXPLAIN
das sagen würde.
Join an Spalten unterschiedlichen Typs?
Leistung von JOIN mit Spalten verschiedener numerischer Typen
Nachdem die Änderungen vorgenommen wurden, um beide Spalten in den gleichen Typ zu verwandeln, begannen die Abfragen dann besser als 50 ms, das ist gut genug für mein Szenario.
Ich vermute, dass die Order-by-Klausel der Schuldige ist. Probieren Sie ein paar Dinge aus. Fügen Sie der Spalte created_at einen Index hinzu. Wenn das klappt, gut, lese nicht weiter! Sonst (oder wenn es funktioniert und Sie eine noch schnellere Abfrage wünschen) Führen Sie diese Abfrage aus, um zu sehen, ob die Ausführung länger dauert:
%Vor%Wenn das das löst, großartig!
Sonst (oder wenn die vorherigen Vorschläge funktionieren und Sie eine noch schnellere Abfrage wünschen) führen Sie die folgenden zwei Schritte durch: 1. führe dieselbe Abfrage ohne die order by-Klausel aus:
%Vor%Wenn das Superduper schnell ausführt, großartig. Dump das Ergebnis davon in eine temporäre Tabelle, und sortieren Sie danach. Dadurch wird Ihre teure Operation in kleinere aufgeteilt, die für den Server einfacher ausgeführt werden können, d. H.
%Vor%Tags und Links mysql amazon-rds database-performance query-performance mysql-slow-query-log