2012-04-10 4 views
0

Wie vermeide ich einen Filesort, wenn ich eine Abfrage nach Bedingung in MySQL bestellen möchte?Wie optimiere ich eine ORDER-Bedingung, um filesort zu verhindern?

ORDER BY (videos_count > 0) DESC, name 

Wäre es besser, eine has_videos boolean Spalte sowie die Zählung cachen?

+0

http://stackoverflow.com/search?q=[mysql]+filesort –

+0

Haben Sie einen zusammengesetzten Index (video_count, name)? Nicht sicher, ob MySQL clever genug ist, um es zu benutzen (wegen der Funktion), aber du wirst es auf jeden Fall brauchen. – Thilo

+0

Ja, ich habe einen zusammengesetzten Index, aber ich glaube, die statischen Indizes helfen nicht beim Vergleich. – rxgx

Antwort

1

Wie etwa die Abfrage in zwei Partitionieren zuerst die, die mit mindestens einem Video, dann der Rest (nur bei Bedarf):

select * from video_table 
where video_count > 0 
order by name 

Und wenn Sie über diejenigen gehen:

select * from video_table 
where video_count = 0 
order by name 
+0

Dies funktioniert hervorragend mit 'video_count! = 0' anstelle von' video_count> 0'. Die beiden Union-Aufrufe erfordern jedoch mehr Zeilen und erfordern einen Tabellenscan, um alles zusammen zu ziehen. – rxgx

+0

Sie würde sie nicht als UNION bezeichnen, aber getrennt, und nur der erste und, falls nötig, der zweite, trat der Anwendungscode bei. Und die Anzahl der Zeilen sollte im schlimmsten Fall gleich sein (und weniger, wenn Sie nur die erste Abfrage ausführen müssen). – Thilo

0

Um einen Dateisort zu vermeiden, müssen Sie in der Regel einen Index treffen - und um einen Index zu treffen, müssen Sie in der Regel nach reinen Spaltenwerten sortieren (da Indizes normalerweise für Spalten erstellt werden)).

+0

Es wird die mit video_count> 0 oben geben, aber es wird nicht nach Namen innerhalb dieser Gruppe sortiert (es wird zuerst nach video_count sortiert). – Thilo

+0

Ah, das habe ich verpasst. In diesem Fall, ja, müssten Sie eine weitere Spalte hinzufügen, wenn Sie nach beiden Dingen sortieren möchten und dennoch einen Dateisort vermeiden. – Amber

Verwandte Themen