2 MySql-Fragen: Performance und Top10
Franco
- datenbank
0 Nachteule0 dedlfix
0 Sven Rautenberg0 dedlfix
0 Franco
Hallo Forum und Mysql-Profis,
ich habe 2 Fragen:
1.- Bringt es der Performance der Abfrage etwas, wenn ich genau weiß, dass in der Ergebnissmenge nur genau 1 Datensatz sein kann/darf und dies mysql über LIMIT mitteile? Oder ist das Pott wie Deckel?
2.- Ich habe eine Tabelle, in der die Punkte der Spieler eines Spieltages festgehalten werden. Also etwa so:
ID-UserID-SpieltagID-Punkte
1-1-1-5
2-1-3-2
3-2-1-2
4-2-2-1
usw.usf.
Kann ich eine Abfrage für die Top10 über alle User über alle Spieltage aus dieser Tabelle machen?
Freundlich grüßt der
Frank
Moin Frank,
Zur ersten Frage kann ich auch nur vermutungen anstellen:
Schaden wirds sicherlich nicht.
Zur zweiten empfehle ich einfach ans Ende der selection 'ORDER BY Punkte LIMIT 10' zu setzen.
Gruß Nachteule
Hi!
1.- Bringt es der Performance der Abfrage etwas, wenn ich genau weiß, dass in der Ergebnissmenge nur genau 1 Datensatz sein kann/darf und dies mysql über LIMIT mitteile? Oder ist das Pott wie Deckel?
Das sagt dir eine Stoppuhr und EXPLAIN. Ich vermute Unterschiede, wenn die Tabelle sehr groß ist und kein Index verwendet werden kann. Dann könnte LIMIT zu einem Abbruch der Suche führen, und Zeit sparen, wenn die Fundstelle recht weit vorn ist.
Kann ich eine Abfrage für die Top10 über alle User über alle Spieltage aus dieser Tabelle machen?
Gruppieren über User und Summe der Punkte bilden.
Lo!
Moin!
Das sagt dir eine Stoppuhr und EXPLAIN. Ich vermute Unterschiede, wenn die Tabelle sehr groß ist und kein Index verwendet werden kann. Dann könnte LIMIT zu einem Abbruch der Suche führen, und Zeit sparen, wenn die Fundstelle recht weit vorn ist.
Ich glaube eher nicht.
LIMIT ist in der Reihenfolge der Ausführung ganz am Ende. Erst muss die DB das komplette Ergebnis ermitteln (das kann ja beispielsweise auch sortiert werden müssen), erst danach wird der per LIMIT gewünschte Ausschnitt gebildet.
Wenn es um Performanceverbesserung geht, ist EXPLAIN genau der richtige Helfer, aber LIMIT nach meiner persönlichen Meinung daran nicht beteiligt. Woran sollte die Datenbank denn erkennen, dass LIMIT das eine Mal vorab bekanntgibt "Brich ab, wenn du den einzigen gefunden hast", und das andere Mal "Finde alle, und gib mir dann nur einen"?
- Sven Rautenberg
Hi!
Das sagt dir eine Stoppuhr und EXPLAIN. Ich vermute Unterschiede, wenn die Tabelle sehr groß ist und kein Index verwendet werden kann. Dann könnte LIMIT zu einem Abbruch der Suche führen, und Zeit sparen, wenn die Fundstelle recht weit vorn ist.
Ich glaube eher nicht.
LIMIT ist in der Reihenfolge der Ausführung ganz am Ende. Erst muss die DB das komplette Ergebnis ermitteln (das kann ja beispielsweise auch sortiert werden müssen), erst danach wird der per LIMIT gewünschte Ausschnitt gebildet.
Theoretisch kommt LIMIT erst auf die gesamte Ergebnismenge zur Anwendung. Aber es gibt Situationen, in denen durch LIMIT die Ergebnismengenbildung abgekürzt werden kann - MySQL LIMIT Optimization. ORDER BY auf eine indexierte Spalte und LIMIT x ist so einer, denn hier ist die Sortierung durch den Index schon erfolgt. Sortieren müssen ohne Index steht dem zeitigen Abbruch allerdings im Weg. Bei SELECT * FROM table WHERE spalte=... LIMIT 1 hingegen kann nach der ersten Fundstelle abgebrochen werden. Inwieweit eine solche Abfrage auf eine per Definition unsortierte Menge die gewünschten Daten liefert, ist eine andere Frage. Eine Möglichkeit wäre auch, Spalte aus der WHERE-Bedingung (unique) zu indexieren, dann geht aus diesem Index schon hervor, dass es keine weiteren Datensätze mehr gibt, wenn der nächste, abweichende Wert im Index auftaucht.
Wenn es um Performanceverbesserung geht, ist EXPLAIN genau der richtige Helfer, aber LIMIT nach meiner persönlichen Meinung daran nicht beteiligt. Woran sollte die Datenbank denn erkennen, dass LIMIT das eine Mal vorab bekanntgibt "Brich ab, wenn du den einzigen gefunden hast", und das andere Mal "Finde alle, und gib mir dann nur einen"?
Man sollte sich nicht unbedingt darauf verlassen, denke ich, sondern durch andere Maßnahmen wie Index für einen schnellen Zugriff sorgen. Da werden aber unsere Datenbankexperten sicherlich mehr Erfahrung beisteuern können.
Lo!
Kann ich eine Abfrage für die Top10 über alle User über alle Spieltage aus dieser Tabelle machen?
Gruppieren über User und Summe der Punkte bilden.
Klappt prima, danke :-)