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

Ein großes Array heißt nicht, daß die einzelnen Einträge groß sind, sondern vielmehr, daß man ein sehr große Anzahl von Einträgen hat. Wenn man 2 Mio Datenbankeinträge hat und die alle in ein Array stopft und dann mit dem Array arbeitet, dann ist es ein großes Array. An der Stelle wäre es sinnvoller nicht mit einem Array zu arbeiten.
 
Also du kannst auch sowas machen:

Lege dir die Tabelle noch ein 2tes mal an und nenne sie z.B. table_temp;
von der Datenstruktur die aber die gleiche wie die orig Tabelle.

dein phpscript für dein cronjob könnte so aussehen:
Code:
<?php
mysql_query("INSERT INTO table_temp SELECT * FROM table_orig");
mysql_query("DELETE FROM table_orig");
mysql_query("INSERT INTO table_orig SELECT * FROM table_temp ORDER BY rang");
?>

Wenn du aber einen Server hast den du z.B. per ssh konfigurieren kannst und die Conrjobs mit crontab konfigurieren kannst dann mache das lieber so:

Lege eine sql-Datei, z.B. sortiere.sql, in der folgende Zeilen stehen
Code:
INSERT INTO table_temp SELECT * FROM table_orig;
DELETE FROM table_orig;
INSERT INTO table_orig SELECT * FROM table_temp ORDER BY rang;

Die Datei kannst du dann aufrufen in etwa damit mysql DATENBANK < /Pfad_zu_Datei/sortiere.sql

Die Zeile brauchst du dann nur zu deinen Crons hinzufügen und ne passende Zeit davor setzen.

Versuche so viel wie möglich mit mySQL zu machen statt mit php, das ist wesentlich schneller.

Aber sinnlos ist das allemal. Wenn deine Rangliste sowieso nur einmal am Tag aktuallisiert werden soll, erzeuge doch um Mitternacht oder sonstwann einfach ne statische HTML-Datei in der alles drinne steht. Oder halt mehrere wenn nicht alle nutzer auf einer Seite angezeigt werden sollen.

Wenn du den Rang als Index setzt kannst du mit OPTIMIZE TABLE table_orig
das sortieren lassen. Ist wahrscheinlich die bessere Variante, aber schau dazu noch mal ins Manual auf Seite 773 (deutsch pdf).
 
Halten wir doch einfach das fest, was jeder bisher zu sagen wußte - die Optimierung von mySQL ist aktuell besser als das, was wir mit einer einfachen Sortierung einer Tabelle erreichen würden und nur sortieren um sortiert zu haben? Ich weiß nicht. Das erscheint mir dann eher wie vergebene Performance.
 
Jop, Cronhjob hab ich bereits verbannt, das wäre nicht sonderlich schwer zu programmieren gewesen, aber ist unsinnig.
Ich weiß schon,w as Arrays sind und arbeite bei den MySQL abfragen nur mit Arrays die höchstens 14 Einträge oder so enthalten, ich arbeit also da nciht mit Datenmassen, keien Angst, so blöd bin ich net :D
Die ganze Datenbank zuerst per PHP auslesen und dann bearbeiten wäre totaler Schwachsinn, deshalb wollte ich ne gute MySQL Abfrage, welches das an einem macht, aber die Methode mit 3 Abfragen könnte auch gehen, ich würd da sogar mit 2 auskommen, glaub ich..

Marius
 
Tut mir wirklich Leid, hab sehr viel Weiterprogrammiert aber an der Sortierung Hakts immer noch :D
Es gibt mehrere Anfragearten:
1. Anfrage nach Rang: Ich benutze bei Rang 15 zb einfach die Anfrage: SELECT * FROM user ORDER BY Punkte LIMIT 8,14
Das Stimmt so weit und geht auch.
2. Anfrage nach einem bestimmten User: Ich lese aus, wie viele Punkte der User hat, stelle daraufhin mit PHP 2 Weitere anfragen, einmal kleiner als die Punkte, einmal größer und dann jeweils die ersten 7.
Das ist soweit auch klar.
3.Anfrage mit einem Teilstring des Usernamens: Jetzt wirds kompliziert. Es klappt ja so weit, als dass ich die User, die zutreffen mit einer WHERE name LIKE,... abfragen kann, aber wenn ich nun noch den Rang für jeden User haben möchte, wird das zu einem Problem. Wie kann ich, ohne für jeden User ne Extra Anfrage zu stellen den Rang rausbekommen?
Was das sinnigste wäre wäre, dass MySQL bei dem Durchgehen durch die Datenbank gleich die Zeilen mitzählt oder so, wie ich das Anstell weiß ich noch nicht. Habt ihr da eine Idee?


Marius
 
jep, ich habe mir alles durchgelesen,
von 2005 bis juli 2006 :-)

ich glaube aber das du um einen cron nicht herum kommen wirst
( jetzt wird es viele böse antworten geben :-) ).

ich habe mir auch ein paar spielen angeguckt und die benutzen offensichtlich
cronjob für ihre ranglisten.
guckt euch das bild an, "johann" hat 213 punkte ist aber noch auf platz 1736
und nach rang 1736 kommt rang 1721. PHP schiebt ihn bei der ausgabe einfach nur nach oben, in der db aber nicht.
ich habe beobachtet das die rangliste etwas alle 1-2 minuten von dem server sortiert wird,
in der zwischenzeit stimmt nur die punktezahl, aber nicht der rang.

der screen stammt aus dem spiel travian ( 0,5 mio accounts weltweit ).
http://img159.imageshack.us/my.php?image=ranglistewk9.gif

PS: an was für einem projekt arbeitest du?
 
Genau das ist es, was mich auch stuzig gemacht hat, dass das offenbar alle so machen. Hab zwar weiterprogrammiert am projekt, aber das Ranglistenproblem ruht immer noch ;)
Das Projekt, an dem ich immer noch bin ist ein Remake des Prügelpause, das es von Lycos vor einiger Zeit mal gab.
Du kannst mich ja mal in ICQ anschreiben, meine Nummer steht hier im Tutorials.de Profil drin.
Hier was kleines zum anschauen, das wird wohl eine Figur werden: http://img388.imageshack.us/my.php?image=b1uu7.swf Derjenige, der sie gezeichnet hat, wollte noch eine weitere Skizze erstellen und diese dann selbst vektorisieren, darauf warte ich im Moment noch, dann werd ich mich ans animieren machen.


Marius
 
ich habe das jetzt so gelöst.

mysql_query("TRUNCATE TABLE rangliste");
mysql_query("INSERT INTO rangliste SELECT NULL, spielerID, spielername, kills FROM spieler ORDER BY kills");

die rangliste hat noch eine zusätzliche spalte mit dem namen "rang" und
ist auf auto_increment eingestellt.
 
Zurück