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

Marius Heil

Erfahrenes Mitglied
Hi,

ich hab eine recht große Tabelle mit Usern in MySQL.
Diese möchte ich per CronJob nach Usern sortieren lassen.
Jetzt tauchen da ein paar Fragen auf:
1. Was mach ich mit der max_execution_time oder wie immer das auch heißt.
2. Ich muss zum sortieren die ganze Tabelle mit dem PHP Script einlesen und sortieren, von der Logik her muss der Server das also alles in den Speicher laden und sortieren.
Was kann ich da am besten machen, dass das dem nicht zu viel wird?
3. Besteht da nicht die Gefahr des Datenverlusts?
Vielleciht tauchen noch weitere Fragen auf, aber ich glaube, das ist erstmal der Großteil.
Würd mich freuen, wenn ihr Ideen hättet, ich mag nicht einfach druaf losprogrammieren und hinterher wird dem Server die Datenmenge zu groß,....


Marius
 
Warum willst Du das machen?
Code:
SELECT * FROM Tabelle ORDER BY User
erledigt das doch live bei der Abfrage und Du hast keine Gefahr des Datenverlusts.

Gruß hpvw
 
Nenenene, das wäre ja schon zu einfach ;)
Es geht darum, meine Rangliste kann zb:
- Nach bestimmten Rängen suchen
- Bestimmte Benutzer nach Kriterien finden
- Die Rangliste durchblättern
Da ich für alle Optionen jeweils Benutzer, Rang, Geld, usw,... brauche muss die Datenbank vorsortiert sein. Ich kann zwar auch Live ne Abfrage ausführen, die mir das ganze durchrechnet, aber das ist 1. kompliziert und 2. meckert der Server dann, wenn er das für jede Abfrage machen darf.
Ich muss also per Cronjob die Liste täglich aktualisieren lassen.


Marius
---
PS: Jetzt erinner ich mich, du hattest mir damals schon geholfen, es ist die gleiche Rangliste.
Das was du mir gesagt hattest, hab ich ne ganze Weile verwendet, allerdings gabs dann noch Probleme mit den unterschiedlichen Dateiversionen und der Server hat sich auf diese Weise überarbeitet, ganz so flexibel wars auch nicht. Danke nochmal für die Lösung, aber ich musste sie schlussendlich verwerfen, tut mir leid.#
---
Edit: Zu deiner Signatur: Ich benutz MySQL irgendwas mit 4.0 :)
 
Zuletzt bearbeitet:
Ich habe gerade mal einen Test gemacht.
Zwei Tabellen mit je drei Feldern.
Eine ID, ein Textfeld und ein INT nach dem sortiert wird.
In der einen Tabelle stehen die Datensätze in zufälliger Reihenfolge, in der anderen werden sie entsprechend der Reihenfolge des INT-Felds eingetragen.
Es stehen die gleichen 10000 Datensätze, natürlich in verschiedener Reihenfolge, in der Datenbank.
Das INT-Feld hat einen Index.
Bei SELECT * FROM ordertable ORDER BY sortFeld macht es keinen zeitlichen Unterschied, aus welcher Tabelle ich die Daten auslese.
Daher Frage ich mich, warum Du den Aufwand betreiben und die Daten sortiert in die Tabelle eintragen willst.

Gruß hpvw
 
Mhhh, ich hab jetzt nicht ganz kapiert, was du gemeint hast.
Ich kann natürlich 2 Tabellen anlegen und das dann per PHP Script von 1er Tabelle in eine andere schreiben und zwar sortiert, da brauch ich keine Angst haben, dass es Datenverlust gibt, weil die 2. noch da wäre.
Ich hab eine Tabelle, da hab ich unter anderem drin:
Geld, Punkte, Username,....
Wenn ich die nicht sortiere, dann muss ich mit jeder Anfrage erst ausrechnen lassen, wer welchen Rang hat, weil ich mag ja als Anfrage zb:
Gib mir bitte Rang 44-53 aus.
Das geht nur, wenn ich ne zusätzliche Spalte mit Rang mach, allerdings verändert sich der Rang ja, wenn einer neue Punkte bekommt.
Um die Ränge zu bestimmen muss ich ja die ganze Tabelle durchsorteiren lassen, oder?


Marius
 
Ich wollte mit dem Test nur zum Ausdruck bringen, dass es ziemlich belanglos ist, ob eine Tabelle bereits in sortierter Form vorliegt oder nicht.
Marius Heil hat gesagt.:
... Diese möchte ich per CronJob nach Usern sortieren lassen. ...
Was Dir weiterhilft ist etwas anderes. Du musst nur (entgegen der Normalisierung, aber aus Performancegründen offensichtlich ratsam) eine weitere Spalte anlegen, die Du Rang nennst und jedesmal neu berechnest, wenn sich an den für dieses Feld relevanten Daten etwas ändert, also eine Art Caching-Mechanismus. Dabei musst Du keine Datenverluste befürchten und benötigst auch keine Cron-Jobs.

Gruß hpvw
 
Marius Heil hat gesagt.:
weil ich mag ja als Anfrage zb:
Gib mir bitte Rang 44-53 aus.
Das geht nur, wenn ich ne zusätzliche Spalte mit Rang mach, allerdings verändert sich der Rang ja, wenn einer neue Punkte bekommt.
Um die Ränge zu bestimmen muss ich ja die ganze Tabelle durchsorteiren lassen, oder?

Vielleicht verstehe ich dich ja falsch aber würde es denn nicht so gehen:
PHP:
SELECT * FROM table ORDER BY punkte DESC LIMIT 44, 53
 
Hi,

kann zwar einiges Programmieren, aber an manchen Stellen hab ich als die blödesten Lücken, wie zb in Flash, damit hab ich 1 Jahr gearbeitet und programmiert und alles und wusste nicht, dass die movieClips ne eigene Zeitleiste haben,d ei ich benutzen kann :D
@cAm3eel: "DESC LIMIT 44, 53" was hat die Zahl nach dem Komma für eine Wirkung?
Soweit ich das mitbekommen hab, ist lediglich die Ausgabe, die ich dann bekomme sortiert, allerdings hab ich, wenn der bei jeder Abfrage die ganze Datenbank durchgehen muss, glaub ich nen größeren Performanceverlust.
@all: Wäre es in dem Zusammenhang nicht auch besser, wenn ich die Datenbank komplett durchsortieren würde?
Dann müsste er zb bei ner Abfrage anch Rang 56-73 nur bis zu Rang 73 die Liste durchgehen und nicht die ganze Liste von sagen wir 2000 nach den Rängen absuchen, die dazwischenliegen.
@hpvw: Die Spalte namens Rang hab ich schon, ich muss also lediglich noch per Cronjob die Felder mit Rang neu schreiben, dzau les ich alles aus und sortier das mit PHP, wobei ich danach die neuen Ränge in die Datenbank schreib.
Wie ist das, wenn gerade User online sind und der schreibt grad die Ränge um, sollte nicht groß auffallen, oder?
Vielleicht ists etwas langsamer,....
Wieso meinst du, ich bräuchte keine Cronjobs?



Marius
 
Marius Heil hat gesagt.:
Wieso meinst du, ich bräuchte keine Cronjobs?
Weil es keinen Sinn macht, die "Sortierung" einer Datenbank einmal täglich zu ändern, wenn möglicherweise mehrmals täglich Daten geändert werden oder auch mal ein paar Tage gar keine Änderungen vorkommen.
Es geht doch auch nicht darum die Tabelle vorzusortieren. Wie mein Test zeigt, hat es nahezu keinen Einfluss, in welcher Reihenfolge die Datensätze in der Datenbank stehen, wenn auf dem Feld, nach dem sortiert wird, ein Index liegt.
Es geht nur darum, die zeitintensive Berechnung des Ranges nicht bei jeder Abfrage durchzuführen.
Um nach Änderungen am Datenbestand nicht bis zum Cronjob falsche Ränge zu präsentieren, muss der Rang nach jeder relevanten Änderung neu berechnet und in der Tabelle gespeichert werden. Damit ist der Cronjob dann überflüssig.

Gruß hpvw
 
Marius Heil hat gesagt.:
@cAm3eel: "DESC LIMIT 44, 53" was hat die Zahl nach dem Komma für eine Wirkung?
Ich dachte immer so werden die Datensetze zw. 44 und 53 ausgegeben, nach Punkten geordnet halt... hab ich mich geirrt?

Marius Heil hat gesagt.:
@cAm3eel: Soweit ich das mitbekommen hab, ist lediglich die Ausgabe, die ich dann bekomme sortiert, allerdings hab ich, wenn der bei jeder Abfrage die ganze Datenbank durchgehen muss, glaub ich nen größeren Performanceverlust.
Stimmt, gut möglich :-)


cAm3eel
 
Zurück