MYSQL Leistung langsam mit filesort

7

Ich habe eine einfache mysql-Abfrage, aber wenn ich viele Datensätze habe (derzeit 103.000), ist die Leistung sehr langsam und es sagt, dass es filesort verwendet, ich bin nicht sicher, ob es deshalb langsam ist. Hat jemand irgendwelche Vorschläge, um es zu beschleunigen? oder stoppe es mit filesort?

MySQL-Abfrage:

%Vor%

Die Erklärungsergebnisse:

%Vor%

Hier ist die Werbung Tabelle und Indizes:

%Vor%     
user1052096 27.08.2012, 20:14
quelle

5 Antworten

16

Das Problem ist, dass MySQL beim Ausführen der Abfrage nur einen Index verwendet. Wenn Sie einen neuen Index hinzufügen, der die 3 Felder in Ihrer WHERE -Klausel verwendet, werden die Zeilen schneller gefunden.

%Vor%

Gemäß der MySQL-Dokumentation ORDER BY-Optimierung :

  

In einigen Fällen kann MySQL keine Indizes zum Auflösen von ORDER BY verwenden, obwohl es immer noch Indizes verwendet, um die Zeilen zu finden, die der WHERE-Klausel entsprechen. Diese Fälle umfassen Folgendes:
  Der Schlüssel, der zum Abrufen der Zeilen verwendet wird, stimmt nicht mit dem in ORDER BY verwendeten Schlüssel überein.

Das passiert in Ihrem Fall. Wie die Ausgabe von EXPLAIN uns sagt, verwendet der Optimierer den Schlüssel price , um die Zeilen zu finden. Das ORDER BY befindet sich jedoch im Feld date_updated , das nicht zum Schlüssel price gehört.

Um die Zeilen schneller zu finden UND die Zeilen schneller zu sortieren, müssen Sie einen Index hinzufügen, der alle Felder enthält, die in den WHERE - und in den ORDER BY -Klauseln verwendet werden:

%Vor%

Das Feld für die Sortierung muss an der letzten Stelle im Index stehen. Es ist sinnlos, price in den Index aufzunehmen, weil die in der Abfrage verwendete Bedingung einen Bereich von Werten zurückgibt.

Wenn EXPLAIN immer noch anzeigt, dass es filesort verwendet, können Sie versuchen, MySQL zu zwingen, einen von Ihnen gewählten Index zu verwenden:

%Vor%

Es ist normalerweise nicht notwendig, einen Index zu erzwingen, weil der MySQL-Optimierer meistens die richtige Wahl trifft. Aber manchmal ist es eine schlechte Wahl oder nicht die beste Wahl. Sie müssen einige Tests ausführen, um zu sehen, ob es die Leistung verbessert oder nicht.

    
Jocelyn 27.08.2012, 20:20
quelle
2

Entfernen Sie die Häkchen um den '0' - es kann derzeit die Verwendung des Index verhindern, aber ich bin mir nicht sicher. Nichtsdestotrotz ist es besser, da der Preis int type und keine Zeichenspalte ist.

%Vor%     
Fabian Barney 27.08.2012 21:26
quelle
1

Ich habe zwei Vorschläge. Entfernen Sie zuerst die Anführungszeichen um die Null in Ihrer where-Klausel. Diese Zeile sollte sein:

%Vor%

Zweitens, erstellen Sie diesen Index:

%Vor%

Dies sollte MySQL erlauben, die 10 Zeilen zu finden, die durch Ihre LIMIT-Klausel spezifiziert sind, indem nur der Index verwendet wird. Filesort selbst ist keine schlechte Sache ... Die Anzahl der Zeilen, die verarbeitet werden müssen, ist.

    
bobwienholt 27.08.2012 21:46
quelle
1

Ihre WHERE Bedingung verwendet price , status , approved zum Auswählen, und dann wird date_updated zum Sortieren verwendet.

Sie brauchen also einen einzelnen Index mit diesen Feldern; Ich würde vorschlagen, auf approved , status , price und date_updated in dieser Reihenfolge zu indizieren.

Die allgemeine Regel ist, WHERE-Gleichheiten an erster Stelle zu setzen, dann Bereiche (mehr als, weniger oder gleich, zwischen usw.) und zuletzt Sortierfelder. (Beachten Sie, dass das Auslassen eines Felds den Index für diesen Zweck möglicherweise weniger nützlich oder sogar unbrauchbar macht).

%Vor%

Auf diese Weise wird der Zugriff auf die Tabellendaten nur benötigt, nachdem LIMIT seine Wirkung entfaltet hat und Sie nur eine kleine Anzahl von Datensätzen langsam abrufen.

Ich würde auch alle nicht benötigten Indizes entfernen, was INSERT s und UPDATE s beschleunigen würde.

    
LSerni 27.08.2012 22:04
quelle
0

MySQL verwendet den Schlüssel date_updated nicht für die Sortierung, sondern verwendet nur den Schlüssel price , wie er in der WHERE -Klausel verwendet wird. Sie könnten versuchen, Indexhinweise zu verwenden:

Ссылка

Fügen Sie etwas wie

hinzu %Vor%     
hol 27.08.2012 20:37
quelle