Große Datenbank (MySQL) (Rangliste) sortieren per Cronjob

Hi Marius

ich möchte einmal die Äußerungen von hpvw unterstützen.
Du brauchst sicher keine tägliche Sortierung durchführen, dazu verwendet man Indexe.

Eine angepaßte SQL-Abfrage fördert Dir alles zu Tage, was du benötigts.

Übrigens ist die Variante mit LIMIT eine gute Lösung, aus einer sortierten Tabellen die Einträge 44 bis 53 zu erhalten. (Siehe MySQL-Referenz)

cAm3eel lag also vollkommen richtig
select * from tabelle ORDER BY PUNKTE LIMIT 43,53; # Zeilen 44 bis 54 zurückgeben Und dann interessiert mich doch noch folgendes:
ich hab eine recht große Tabelle mit Usern in MySQL.
Wie groß ist denn die Tabelle?


Ich vermute, dass Sie weit weniger als 1000000 Datensätze haben wird, oder?
Von daher ist die Tabelle nicht wirklich groß.

Deine Performance-Sorgen sind vermutlich völlig unberechtigt.


Mein Fazit:
Vergiss die cronjobs und die Sortierarbeit.
Lass Dir die Tabelle durch einen geeigneten SQL-Befehl in der gewünschten Form ausgeben.
Investiere lieber ein wenig Zeit, SQL besser zu verstehen, dann entdeckst Du dort eine Menge Möglichkeiten.

vop
 
Zuletzt bearbeitet:
Nur, um Missverständnisse aus dem dem Weg zu räumen:
Code:
... LIMIT 44,53
ermittelt 53 Zeilen ab der 44. Zeile, wobei die Zeilennummer 0 die erste Zeile darstellt, und nicht die Zeilen Zeilen 44 bis 53.
Zumindest steht das so im Handbuch.

Gruß hpvw
 
Nur, um Missverständnisse aus dem dem Weg zu räumen: Code:
... LIMIT 44,53​

ermittelt 53 Zeilen ab der 44. Zeile, wobei die Zeilennummer 0 die erste Zeile darstellt, und nicht die Zeilen Zeilen 44 bis 53.

absolut korrekt, mein Fehler, sorry.

vop
 
@nauv: Öhhhhm, jop ;)
Alllso, kurzes Summary:
-Limit 44,53 ist nicht zu gebrauchen, da es was anderes macht.
-Mhh, MySQL besser lernen, nun ja, ich hab einige Bücher über PHP gelesen, da war MySQL immer ein wenig dabei. Bisher reichen mir meine Kenntnisse eigentlich völlig aus, Abfrage, Update, Löschen,....
Wie groß die Tabelle wird, kann ich net sagen, derzeti ist sie noch klein, aber wenn MySQL so viel schafft, bruach ich da wohl wirklich net so viel Angst haben. Ich denk mir nur immer, wie der PC so viele Daten durcharbieten soll,...
Nun aber:
Wenn ich wegen jedem User, der gerade 3 Pünktchen bekommen hab die ganze Ränge in der MySQL Liste neuschreiben muss, das kommt mir net gesund vor.
Bei den Cronjobs müsste ich es nur in bestimmten Abständen machen, selbst wenn ich das jede Stunde mach, kommt der Server noch deutlich besser weg, als mit dauernder Umschreibung.
Ich hab das in mehreren Onlinespielen bemerkt, dass die Ranglsite immer erst nach ner Zeit wieder stimmt, das muss doch nen Grund haben.
Gibts in MySQl nen Befehl dafür, dass ich Zeilen verschieben kann?
Das wäre das beste, ich würde eifnach bei jedem Punktegewinn die Zeile an die richtige Stelle der Tabelle schieben, mit ner Rangspalte geht das eher schelcht, wenn ich was verschieb, muss ich immer die gnazen zahlen ändern.


Marius
 
Marius Heil hat gesagt.:
Gibts in MySQl nen Befehl dafür, dass ich Zeilen verschieben kann?
Nein gibt es nicht. Du müsstest alles auslesen, sortieren, löschen und neu eintragen.
Wie ich oben erwähnt (und mehrfach wiederholt) habe, bringt das für die Performance beim Auslesen gar nichts.
Ein Index auf der zu sortierenden Spalte bringt Dir (in oben dargestellter Testumbegung) eine Beschleunigung um ungefähr das dreifache.
Query-Cache zu aktivieren hilft, dass auch eine Tabelle ohne Index nur einmal nach jeder Änderung langsam ausgelesen wird und dann genauso schnell, wie mit Index, ist.

Gruß hpvw
 
Hi Marius

Nochmal zum mitlesen

1. Wenn ein User Punkte macht: UPDATE der PUNKTE für den User - fertig
(Kein RANKING speichern!)
2. Wenn Du das Ranking anzeigen willst (oder sonst irgend etwas) entsprechendes SELECT
mit ORDER BY PUNKTE - fertig

Eine sonstige Sortierung ist nicht nötig, das geschieht durch geeignetes Select und ggf. INDEXEN!

Das Speichern des Rankings ist nicht nötig, im Gegenteil eher hinderlich!

Das Ranking kannst du online ermitteln, wenn Du nach PUNKTEN sortierst

Die Plätze 10 bis 20 erhälst du beispielsweise mit
SELECT * FROM TABELLE
ORDER BY PUNKTE
LIMIT 9,10

Das sind vom 10. Eintrag beginnend 10 Einträge.

Alles klar?

vop
 
Aaalso, tut mir leid, dass ich so ewig nicht mehr geantwortet habe. Hab erst jetzt mitbekommen, dass es neue Beiträge gibt.
Ich glaub, ich muss nochmal von vorne anfangen ;)
Hab inzwischen alles andere Programmiert, nur nicht die Sortierung.
Das was vop da gerade zusammengefasst hat, stimmt nicht grad, bin ich der Meinung.
Wenn ich diese Anfrage hier:
SELECT * FROM TABELLE
ORDER BY PUNKTE
LIMIT 9,10
Ausführe, liest mir die MySQL Datenbank alle Datensätze von 10 bis 20 aus. Ich hab zwar nicht allzuviel MySQL gelesen, allerdings hatte ich schonmal getestet, was Order by macht. Das Ordnet mir alle !Ausgelesenen! Datensätze nach bestimmte Kriterien, jedoch nicht die Tabelle vor dem Auslesen, ich bekomme also dadurch 10 zufällige Datensätze.
Ich bin deshalb der Meinung, es ist unbedingt notwendig eine Spalte namens Rang anzulegen, die ich auch schon habe.
Nun mache ich jedes mal eine Umsortierung, wenn ein User Punkte bekommt, weil ihr meintet, das ist nicht Performancelastig.
Allerdings: Wenn ich sagen wir mal 5000 User habe, nur als Beispiel, dann ist Rang 15 plötzlich auf 14 gerutscht. Dann muss ich doch einfach nur den Rang auf 14 umschreiben und folglich alle User, die dazwischenliegen +1 machen.
Meinen da alle das selbe?


Marius
 
Marius Heil hat gesagt.:
Ausführe, liest mir die MySQL Datenbank alle Datensätze von 10 bis 20 aus. Ich hab zwar nicht allzuviel MySQL gelesen, allerdings hatte ich schonmal getestet, was Order by macht. Das Ordnet mir alle !Ausgelesenen! Datensätze nach bestimmte Kriterien, jedoch nicht die Tabelle vor dem Auslesen, ich bekomme also dadurch 10 zufällige Datensätze.
Wie es auch die Reihenfolge in der Syntax andeutet, wird LIMIT erst nach der Sortierung angewendet.

Marius Heil hat gesagt.:
Ich bin deshalb der Meinung, es ist unbedingt notwendig eine Spalte namens Rang anzulegen, die ich auch schon habe.
Nun mache ich jedes mal eine Umsortierung, wenn ein User Punkte bekommt, weil ihr meintet, das ist nicht Performancelastig.
Allerdings: Wenn ich sagen wir mal 5000 User habe, nur als Beispiel, dann ist Rang 15 plötzlich auf 14 gerutscht. Dann muss ich doch einfach nur den Rang auf 14 umschreiben und folglich alle User, die dazwischenliegen +1 machen.
Meinen da alle das selbe?
Das verstehe ich nicht, aber ich glaube, Du verrennst Dich.

Gruß hpvw
 
Zurück