TS: 50 Mio Datensätze Zuordnung, Abfragen, Performance

Beitrag lesen

Hallo und guten Tag,

Das ist sicherlich handhabbar. Aber bei bei Vielspielern wird es zum Problem, bei jedem Spiel die für sie relevanten Rows zu laden. Hat der Spieler schon 5000 Fragen gespielt, muss man für ihn 5000 Rows laden. Bei Verwendung eines Cluster-Index stehen die zwar beisammen, aber dafür hast Du den Aufwand des Clusterns. Des weiteren sind 2/3 des zu lesenden Volumens (db-intern) keine Fragenummer, sondern die Usernummer. Für Wenigspieler mag das eine sinnvolle Lösung sein, bei Vielspielern würde ich das nicht tun.

Um sich den Aufwand mit einer Neuindexierung zu ersparen, wird man das Problem anders lösen!

Für die Fragen baut man sich eine direkt gestreute Tabelle mit einem Feld "Spiel-Status[1]". Für den User baut man sich jeweils eine Tabelle, welche Fragen er schon gespielt hat. Beginnt ein User ein neues Spiel, wählt man für Ihn ein Kontingent an Fragen aus, das auch sofort im Spiel-Status als "im Spiel" gekennzeichnet wird. Da kein Index neu geschrieben werden muss, geht das relativ schnell.

Für andere Spieler sind diese Fragen dann solange gesperrt oder - wenn der User sie tatsächlich alle spielt - bleiben sie es auch. Sie werden dann nach und nach nur im Status-Feld auf "gespielt" umgestellt. Wenn der Benuter abbricht, werden die nicht gespielten Fragen "zurückgegeben". Das bedeutet, der Status wird auf frei zurückgesetzt.

Um keinen nicht balancierten Index zu erzeugen für die Status-Felder, kann man dann von Zeit zu Zeit die gepielten Fragen aus der Tabelle entfernen (wenn Zeit dafür ist).

Wenn die Fragen bereits in gemischter Form in der Tabelle vorliegen, braucht man sie nur von vorne streng sequentiell ab einem Aufsetzpunkt durchzuackern, bis man jeweils ein Kontingent für einen User zusammengetragen hat. Da hierbei nur zum Auffinden des Aufsetzpunktes ein Indexzugriff benötigt wird, vermindern sich die Indexzugriffe um den Faktor der Anzahjl der Fragen pro Spiel.

Nach diesem Schema baue ich Dir das ohne Datenbanksystem (habe ich 1991 schon mal...).

[1] Man kann auch direkt die Usernummer einsetzen, 0 == "ungespielt".

Ich hoffe, Ihr konntet mir folgen.

Grüße
TS

--
es wachse der Freifunk
http://freifunk-oberharz.de