Ich habe eine Tabelle mit Spalten:
%Vor%Wenn ich eine Abfrage wie:
mache %Vor%Die Abfrage dauert 10 Sekunden, zu erklären ist:
%Vor%Wenn ich auch by / order by column a gruppiere, brauche ich keinen temporären / filesort, aber mache dasselbe in einer anderen Abfrage selbst:
%Vor%Die Abfrage dauert 1 Sekunde und die Erklärung lautet:
%Vor%Warum ist das? Warum ist es schneller, wenn ich die Gruppierung in einer separaten, äußeren Abfrage mache, statt sie einfach in einem zu tun?
Die Art und Weise, wie SQL arbeitet, ist, je weniger Daten Sie bei jedem Schritt haben, desto schneller wird die Abfrage ausgeführt. Da Sie zuerst die Gruppierung in der inneren Abfrage durchführen, werden Sie viele Daten los, die die externe Abfrage nicht mehr verarbeiten muss.
SQL-Optimierung sollte einige Ihrer Fragen beantworten. Aber am wichtigsten ist es, sich zu erinnern, je mehr Dinge Sie frühzeitig in der Abfrage eliminieren können, desto schneller wird die Abfrage ausgeführt.
Es gibt auch einen Teil der Datenbank, der verschiedene Methoden zum Ausführen einer Abfrage ausprobiert. Dieser Teil des Servers wird die meiste Zeit den schnellsten Weg wählen, aber die Spezifizierung in Ihren Abfragen kann wirklich helfen. Mehr dazu auf dieser Seite: Lesungen in Datenbanksystemen
Wenn Sie Ihre Erläuterungen betrachten, scheint es, als würde der Dateiort in einer so großen Anzahl von Zeilen die Anfrage wahrscheinlich sehr verletzen. da die Zeilen in der Primärabfrage (der äußere Bereich der zweiten Abfrage) von einer Tabelle im Arbeitsspeicher abgearbeitet werden.
Im ersten Fall wird der Index verwendet, um übereinstimmende Datensätze zu finden, aber er kann nicht zum Sortieren verwendet werden, da die Spalte ganz links in der Gruppe / order by-Klauseln nicht enthalten ist. Ich wäre daran interessiert, beide Queries zu sehen:
Profilerstellung = 1;
führe Abfrage 1 aus;
Abfrage 2 ausführen;
Zeige Profil für Abfrage 1;
Profil für Abfrage 2 anzeigen;
Nur aus Neugier, können Sie diese Version versuchen?:
%Vor%und dieser:
%Vor%und das:
%Vor%**** Bearbeitet: Keine gute Antwort, da ich den Ort nicht gesehen habe.
Ich denke, es ist einfach so, dass MySQL bei der zweiten Abfrage einen Index verwendet und der erste nicht.
Wenn Sie einen Index wie (b, c, metric)
erstellen, bin ich mir ziemlich sicher, dass die erste Abfrage schneller als die zweite sein wird.
Bearbeitet, um ausführlicher zu sein:
Erste Abfrage:
Zweite Abfrage:
Tags und Links optimization mysql performance