Mysql langsame Abfrage: INNER JOIN + ORDER BY verursacht filesort

8

Ich versuche diese Abfrage zu optimieren:

%Vor%

Die Größe der Tabellen ist 38k Zeilen, und 31k und mysql verwendet "filesort", so dass es ziemlich langsam wird. Ich habe versucht, verschiedene Indizes zu verwenden, kein Glück.

%Vor% %Vor%

Welche Art von Index muss ich definieren, um mysql mit filesort zu vermeiden? Ist es möglich, wenn das Auftragsfeld nicht in der where-Klausel ist?

Aktualisierung: Profilergebnisse:

%Vor%

update2:

Real-Abfrage (einige mehr boolesche Felder, mehr nutzlose Indizes)

%Vor%

Leeres Set (1,25 Sek.)

Ohne ORDER BY - 0.01s.

%Vor%

LÖSUNG

  1. Abfrage aktualisiert auf "ORDER BY posts_tags.created_at DESC" (zwei kleine Änderungen im App-Code)
  2. Index hinzugefügt: index_posts_tags_on_created_at.

Das ist alles!

    
Alexander 10.06.2010, 14:33
quelle

3 Antworten

3

Sie müssten ein wenig denormalisieren und das posts.created_at-Feld in die post_tags-Tabelle kopieren (ich nannte es post_created_at, Sie könnten es so nennen, wie Sie wollen):

%Vor%

und fügen Sie dann einen Index zu posts_tags auf

hinzu %Vor%

Das ermöglicht der Abfrage, alle Posts für ein Tag in der richtigen Reihenfolge ohne filesort zu erhalten.

    
nathan 10.06.2010, 19:45
quelle
1

Versuchen Sie, KEY index_posts_tags_on_post_id_and_tag_id ( post_id , tag_id ) in KEY index_posts_tags_tag_id ( tag_id ) und repost Explain zu ändern.

Was ist die Verteilung von TagIDs mit Posts_Tags?

    
Gary 10.06.2010 14:42
quelle
0

Ihr Schlüssel index_posts_on_created_at ist aufsteigend sortiert, aber die Ergebnisse sollen absteigend sortiert werden.

    
SQLMenace 10.06.2010 14:38
quelle