Verwenden Sie temporär, mit filesort eine schlechte Idee in mysql?

7

Ich versuche, meine mysql-Abfragen zu optimieren, um zu vermeiden, dass "temporary, using filesort" verwendet wird. Ich könnte etwas Hilfe gebrauchen. Zuerst; Hier ist die Erklärung

Hier ist die Abfrage

%Vor%

Es sind 2 Tische beteiligt. ProfileFriends (pf) und Mitglieder (m). Diese Abfrage versucht nur die 'letzten' 24 Freunde für diese bestimmte Mitglieds-ID zu finden. Recent bedeutet Sortieren nach LastLogin Datum.

Danke

    
shergill 05.09.2009, 02:16
quelle

3 Antworten

17

Es ist ein Problem? Ja.

Ist es ein Problem, wenn Sie mit 160 Zeilen arbeiten? Nein.

"Filesort" ist eine Methode, nicht die eigentliche Erstellung einer Datei und deren Sortierung. Wenn wir über 160.000 Zeilen statt 160 Zeilen sprechen würden, dann gäbe es wahrscheinlich Grund, weitere Optimierungen in Betracht zu ziehen.

Bearbeiten: Außerdem haben Sie die tatsächliche Laufzeit der Abfrage ausgelassen. Sie treffen Indizes und arbeiten nur mit einer Handvoll Zeilen. Wenn diese Abfrage mehr als einen Bruchteil einer Sekunde dauert, lohnt es sich wahrscheinlich nicht einmal, nach Optimierung zu suchen.

    
Charles 05.09.2009 02:20
quelle
2

Ich denke, Sie sollten in der Lage sein, den temporären / filesort mit einem Index für members (id,lastLogin) in dieser Reihenfolge zu vermeiden - , aber für diese Art von Abfragen ist es übertrieben und nach Ihrer EXPLAIN zu urteilen, scheinen Sie es zu sein hab das schon probiert?

Sie können es mit einem PRIMARY / UNIQUE KEY in profile_friends (member_id,friend_id) ergänzen und sehen, wie es funktioniert.

Wenn diese Abfrage in letzter Instanz so oft und mit so vielen Datensätzen ausgeführt wird, dass Sie die schnellste SELECT-Operation durchführen müssen, können Sie Ihre Tabelle denormalisieren und eine Kopie Ihrer members.lastLogin -Spalte zu profile_friends mit einem Index hinzufügen auf (member_id,lastLogin) . Damit hättest du keinen Join, keinen Filesort, nichts. Auf der anderen Seite haben Sie große UPDATE-Abfragen jedes Mal, wenn sich jemand mit vielen Freunden anmeldet. Auch dies scheint völlig übertrieben für die Art von Zahlen, über die Sie sprechen.

Ich habe fast vergessen, die ursprüngliche Frage zu beantworten:

  

Mit temporary, using filesort eine schlechte Idee in mysql?

Nein, ist es nicht. Wenn Sie es leicht optimieren können, sollten Sie immer nach "filterortfreien" Abfragen suchen, aber ansonsten sollten Sie sich keine Sorgen machen, es sei denn, sie stellen ein echtes Leistungsproblem dar. Filesort ist Teil der normalen Ausführung einer Abfrage.

    
Josh Davis 05.09.2009 02:39
quelle
1

Das ist der effizienteste Weg, diese Abfrage zu schreiben.

Stellen Sie sicher, dass für pf.friend_id , pf.member_id und m.id Indizes vorhanden sind. Dann verwendet es die Indizes, um die Tabellen zu verbinden und die Ergebnisse zu filtern.

Diese Art wird sowieso wegen Ihrer order by kommen.

    
Eric 05.09.2009 02:20
quelle

Tags und Links