Zwei Abfragen schneller als eins?

9

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?

    
Jaka Jančar 26.09.2011, 14:03
quelle

4 Antworten

2

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.

    
Serdalis 26.09.2011 14:19
quelle
1

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;

    
ggiroux 26.09.2011 15:00
quelle
0

Nur aus Neugier, können Sie diese Version versuchen?:

%Vor%

und dieser:

%Vor%

und das:

%Vor%     
ypercubeᵀᴹ 26.09.2011 15:04
quelle
0

**** 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:

  • Es gibt keinen guten Index für die Abfrage.
  • Der Testindex ist aktiviert (a, b, c, metrisch) und Sie benötigen einen Index für (b, c) ((b, c, metrisch) wäre auch gut)
  • Vielleicht benutzt MySQL den Testindex, aber es ist kein guter Index, also ist es wie ein vollständiger Scan der Tabelle.

Zweite Abfrage:

  • Verwendet den Index (a, b, c)
  • Bei der zweiten Instanz wird eine Nicht-Index-Abfrage ausgeführt, jedoch mit weniger Daten als bei der ersten Abfrage.
DavidEG 26.09.2011 14:22
quelle

Tags und Links