Datenbank Engine? Serverauslastung?

Datenbank Engine? Serverauslastung?

am 24.10.2006 10:17:49 von Christian Franzen

Hi!

Ich code gerade an nem Browsergame in PHP und mach mir en paar gedanken über
die Auslastung des Servers, die ja zu Zeiten doch recht hoch sein kann.

Hab mir jetzt en paar gedanken über die Datenbank gemacht. Benutze MySQL,
bin mir aber unsicher welche Engine ich benutzen soll, MyISAM, InnoDB, ...?
Hab schon en paar Artikel gelesen nach denen InnoDB angeblich wesentlich
mehr Speicherplatz braucht und wesentlich langsamer ist als alle anderen.
Könnt ihr das
irgendwie bestätigen? Das würde ja dann in meinem Fall schon mal klar
dagegen sprechen.
Oder was meint ihr dazu?

Meinen Anforderungen an die Engine sind eigentlich ziemlich gering. Es
reicht wenn ich
daten SELECTen, INSERTen und UPDATEn kann, um die Sicherheit der Übertragung
und die Konsitenz der Daten mach ich mir da keine großen Sorgen. PHP-Script
und Mysql-
Server laufen ja auf dem selben Server. (Oder darf man dann trotzdem nicht
davon ausgehen
das da nicht viel an Fehlübertragungen zustande kommen?)

Was würdet ihr mir empfehlen? Wie gesagt: Hauptsache schnell und die
Leistung des Servers
schonend sollte es sein!

thx Xion

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 10:21:19 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 10:28:05 von Christian Franzen

Ich hab deinen post gerade gelesen. Der hilft mir aber nicht wirklich
weiter. Ihr streitet euch doch nur ununterbrochen, über Datenkonsitenz und
Übertragungssicherheit. Was soll ich damit anfangen?


"Andreas Kretschmer" schrieb im Newsbeitrag
news:v0v014-kp7.ln1@tux.schollglas.com...
> begin Christian Franzen schrieb:
>> Hi!
>>
>> Ich code gerade an nem Browsergame in PHP und mach mir en paar gedanken
>> über
>> die Auslastung des Servers, die ja zu Zeiten doch recht hoch sein kann.
>>
>> Hab mir jetzt en paar gedanken über die Datenbank gemacht. Benutze MySQL,
>> bin mir aber unsicher welche Engine ich benutzen soll, MyISAM, InnoDB,
>> ...?
>
> <453771f3$0$18848$9b4e6d93@newsspool4.arcor-online.net>
>
> Es reicht, dies einmal pro Woche durchzukauen.
>
>
>
> end
> Andreas
> --
> Andreas Kretschmer
> Linux - weil ich es mir wert bin!
> GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
> Deutsche PostgreSQL User Group: http://pgug.de

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 10:57:50 von Axel Schwenke

"Christian Franzen" wrote:

> Ich code gerade an nem Browsergame in PHP und mach mir en paar gedanken über
> die Auslastung des Servers, die ja zu Zeiten doch recht hoch sein kann.

Ein Browser-Spiel, das Last auf der Datenbank erzeugt? Muß ein
komisches Spiel sein.

> Hab mir jetzt en paar gedanken über die Datenbank gemacht. Benutze MySQL,
> bin mir aber unsicher welche Engine ich benutzen soll

Die, die für deine Anforderungen paßt. Offensichtlich kennst du deine
Anforderungen nicht.

> Hab schon en paar Artikel gelesen nach denen InnoDB angeblich wesentlich
> mehr Speicherplatz braucht und wesentlich langsamer ist als alle anderen.
> Könnt ihr das irgendwie bestätigen?

Nein. Außerdem sind alle Pauschalurteile falsch (pun intended).

> Meinen Anforderungen an die Engine sind eigentlich ziemlich gering. Es
> reicht wenn ich daten SELECTen, INSERTen und UPDATEn kann

Das ist gar kein Kriterium. Außer Blackhole (eine Art Nulldevice)
bieten das alle Engines von MySQL.

> um die Sicherheit der Übertragung und die Konsitenz der Daten mach
> ich mir da keine großen Sorgen. PHP-Script und Mysql-Server laufen
> ja auf dem selben Server. (Oder darf man dann trotzdem nicht davon
> ausgehen das da nicht viel an Fehlübertragungen zustande kommen?)

Datenkonsistenz hat nichts mit Fehlübertragungen zu tun.

> Was würdet ihr mir empfehlen? Wie gesagt: Hauptsache schnell und die
> Leistung des Servers schonend sollte es sein!

Eigentlich gibt es zu wenig Informationen für eine sinnvolle
Empfehlung. Aber nachdem du wahrscheinlich nur Highscores in der
Datenbank speichern wirst - nimm MyISAM.


XL

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 11:11:44 von Guido Schmidt

Christian Franzen schrieb:
> Ich hab deinen post gerade gelesen. Der hilft mir aber nicht wirklich=20
> weiter. Ihr streitet euch doch nur ununterbrochen, über Datenkonsiten=
z und=20
> Übertragungssicherheit. Was soll ich damit anfangen?

Du versuchst das Pferd von hinten aufzuzäumen. Mache Dir bitte erst=20
einmal Gedanken, ob Du beispielsweise Transaktionen brauchst, um die=20
Integrität Deiner Daten sicherzustellen. Wenn das der Fall ist, kommst =

Du an InnoDB (bzw. NDB) nicht vorbei.

Darüber hinaus gibt es keine pauschal schnelle oder langsame=20
Datenbank(engine). Es gibt nur schnellere oder langsamere=20
Datenbankengines für genau spezifizierte Bedingungen. (Ein=20
500-PS-Ferrari ist schneller als eine 2-PS-Vespa. Richtig? Auch im=20
staubehafteten Stadtverkehr?).

Die wesentlichen funktionellen Unterschiede der Datenabkengines findest=20
Du hier:
http://dev.mysql.com/doc/refman/5.1/en/storage-engine-choosi ng.html

Guido

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 11:30:40 von Christian Franzen

Also ich speichere in der Datenbank im Prinzip alles. Session-Infos,
Benutzerdaten, Gebaute Einheiten und Gebäude, Kolonien jedes Benutzers,
Forschungen...

Aus dem Grund will ich ja auch dass, das alles schnell läuft, denn
dementsprechend viele Datenbank aufrufe hab ich auch. Ich würde mal grob
schätzen, dass mit jedem Seitenaufruf mindesten 3 SELECT-Querys an die
Datenbank gehen.


"Axel Schwenke" schrieb im Newsbeitrag
news:eikkhe.9ru.ln@xl.homelinux.org...
> "Christian Franzen" wrote:
>
>> Ich code gerade an nem Browsergame in PHP und mach mir en paar gedanken
>> über
>> die Auslastung des Servers, die ja zu Zeiten doch recht hoch sein kann.
>
> Ein Browser-Spiel, das Last auf der Datenbank erzeugt? Muß ein
> komisches Spiel sein.
>
>> Hab mir jetzt en paar gedanken über die Datenbank gemacht. Benutze MySQL,
>> bin mir aber unsicher welche Engine ich benutzen soll
>
> Die, die für deine Anforderungen paßt. Offensichtlich kennst du deine
> Anforderungen nicht.
>
>> Hab schon en paar Artikel gelesen nach denen InnoDB angeblich wesentlich
>> mehr Speicherplatz braucht und wesentlich langsamer ist als alle anderen.
>> Könnt ihr das irgendwie bestätigen?
>
> Nein. Außerdem sind alle Pauschalurteile falsch (pun intended).
>
>> Meinen Anforderungen an die Engine sind eigentlich ziemlich gering. Es
>> reicht wenn ich daten SELECTen, INSERTen und UPDATEn kann
>
> Das ist gar kein Kriterium. Außer Blackhole (eine Art Nulldevice)
> bieten das alle Engines von MySQL.
>
>> um die Sicherheit der Übertragung und die Konsitenz der Daten mach
>> ich mir da keine großen Sorgen. PHP-Script und Mysql-Server laufen
>> ja auf dem selben Server. (Oder darf man dann trotzdem nicht davon
>> ausgehen das da nicht viel an Fehlübertragungen zustande kommen?)
>
> Datenkonsistenz hat nichts mit Fehlübertragungen zu tun.
>
>> Was würdet ihr mir empfehlen? Wie gesagt: Hauptsache schnell und die
>> Leistung des Servers schonend sollte es sein!
>
> Eigentlich gibt es zu wenig Informationen für eine sinnvolle
> Empfehlung. Aber nachdem du wahrscheinlich nur Highscores in der
> Datenbank speichern wirst - nimm MyISAM.
>
>
> XL

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 11:36:07 von Christian Franzen

> Datenkonsistenz hat nichts mit Fehlübertragungen zu tun.

Sondern womit? Ich gebe ehrlich zu nicht viel Ahnung von MySQL bzw.
Datenbanken allgemein zu haben.

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 12:00:52 von Johannes Vogel

Hi Christian

Christian Franzen wrote:
> Also ich speichere in der Datenbank im Prinzip alles. Session-Infos,
> Benutzerdaten, Gebaute Einheiten und Gebäude, Kolonien jedes Benutzers,
> Forschungen...
> Aus dem Grund will ich ja auch dass, das alles schnell läuft, denn
> dementsprechend viele Datenbank aufrufe hab ich auch. Ich würde mal grob
> schätzen, dass mit jedem Seitenaufruf mindesten 3 SELECT-Querys an die
> Datenbank gehen.

Über TOFU hast du dich mittlerweile offenbar informiert. Prima.

3 Selects sind minimale Last. Natürlich interessieren aber nicht die 3
Selects pro Seite, sondern Anzahl Selects pro Sekunde in Spitzenzeiten
und wie lange diese dauern. Explain hilft hier, ob die Indices auch
wirklich benutzt werden.

In der Zwischenzeit habe ich mir mal im Kopf ein bisschen über
Browsergames Gedanken gemacht. Das müsste doch eine serverseitige
Realtime Discrete Event Machine sein? Und über die Websites ruft man den
aktuellen Status ab, bzw. fügt neue Events in die Liste ein.

Jetzt suchen wir mal Bottlenecks: ServerEngine kann kurzzeitig
überlastet werden, wenn viele Leute gleichzeitig Statusänderungen
initiierten, die jetzt auszuführen sind. Hier müsste wohl mit
Locking-Verfahren verhindert werden, dass falsche Informationen
rumgeistern. Die Abarbeitung müsste möglichst über Stored Procedures
erfolgen, um der Datentransport zwischen Applikation und Datenbank zu
minimieren und die Abarbeiten schneller zu gestalten.

Weiter könnte es beim Userinterface Probleme bei der Netzanbindung
geben. Das ist hier aber nicht Thema.

Vielleicht solltest du deshalb die beiden Teile auch auf zwei oder mehr
Server aufteilen, falls du wirklich viele Anfragen kriegst. Dazu gibt's
bspw. das Master/Slave-Modell bei MySQL.

Einfach ein paar Gedanken...
HTH, Johannes

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 12:24:05 von Axel Schwenke

"Christian Franzen" wrote:
>> Datenkonsistenz hat nichts mit Fehlübertragungen zu tun.
>
> Sondern womit? Ich gebe ehrlich zu nicht viel Ahnung von MySQL bzw.
> Datenbanken allgemein zu haben.

Dann solltest du das nachholen. Stichworte: Transaktionen,
referentielle Integrität.

Transaktion: Spieler 0815 kauft bei Händler 4711 eine Rüstung für
1000 Kredits. Die folgenden SQL-Statements sollten entweder *alle*
*zusammen* erfolgreich sein oder keines davon:

UPDATE konto SET guthaben=guthaben-1000 WHERE user_id=0815
AND guthaben >= 1000
UPDATE konto SET guthaben=guthaben+1000 WHERE user_id=4711
UPDATE bestand SET anzahl=anzahl-1 WHERE user_id=4711
AND item='Rüstung' AND anzahl >= 1
INSERT INTO ausruestung (user_id, item) VALUES (0815, 'Rüstung')

Wenn dir mitten in diesen Aktionen die Festplatte ausfällt, dein PHP
crasht, MySQL das RAM ausgeht oder schlicht und ergreifend der Händler
keine Rüstung mehr hat (weil gerade ein anderer die letzte gekauft hat)
- dann ist die Datenbank inkonsistent. Jemand verliert Geld oder Aus-
rüstung oder es taucht eines davon plötzlich auf. Willst du nicht.


So. Ein Beispiel für referentielle Integrität denkt sich jetzt jemand
anderes aus...


XL

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 12:38:15 von Christian Franzen

Ok. Das hab ich gerade noch verstande. Dachte aber eigentlich mit PHP könnte
man nur eine MySQL-Anweisung aufeinmal ausführen. Aber sowas brauche ich auf
jedenfall. Dann komm damit währe ich dann wohl auf InnoDB festgelegt oder?

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 12:46:11 von Christian Franzen

> 3 Selects sind minimale Last. Natürlich interessieren aber nicht die 3
> Selects pro Seite, sondern Anzahl Selects pro Sekunde in Spitzenzeiten
> und wie lange diese dauern.

Gehen wir mal von maximal 1000 gleichzeitgen Seitenbesuchern aus, dann
werden das wohl einige sein.

>Explain hilft hier, ob die Indices auch wirklich benutzt werden.

Versteh jetzt nicht ganz was du mir damit sagen willst?

> In der Zwischenzeit habe ich mir mal im Kopf ein bisschen über
> Browsergames Gedanken gemacht. Das müsste doch eine serverseitige
> Realtime Discrete Event Machine sein? Und über die Websites ruft man den
> aktuellen Status ab, bzw. fügt neue Events in die Liste ein.

Jo so in etwa. Über die Webseite kann man seinen aktuellen "Status"
anzeigen, also Truppen anzahl, Ressourcen... und neue Events in die
Datenbank eintragen. Bei jedem Seitenaufruf wird dann geprüft ob seit dem
letzten Seitenaufruf ein Event stattgefunden hat, also z.B. Truppe hat ihr
Ziel erreicht oder Gebäude würde fertiggestellt, und wenn ja wird dieses
bearbeitet

> Jetzt suchen wir mal Bottlenecks: ServerEngine kann kurzzeitig
> überlastet werden, wenn viele Leute gleichzeitig Statusänderungen
> initiierten, die jetzt auszuführen sind. Hier müsste wohl mit
> Locking-Verfahren verhindert werden, dass falsche Informationen
> rumgeistern. Die Abarbeitung müsste möglichst über Stored Procedures
> erfolgen, um der Datentransport zwischen Applikation und Datenbank zu
> minimieren und die Abarbeiten schneller zu gestalten.

Hört sich gut an aber Locking-Verfahren und Stored Procedures sagt mir nix

> Weiter könnte es beim Userinterface Probleme bei der Netzanbindung
> geben. Das ist hier aber nicht Thema.

Was meinst du damit?

> Vielleicht solltest du deshalb die beiden Teile auch auf zwei oder mehr
> Server aufteilen, falls du wirklich viele Anfragen kriegst. Dazu gibt's
> bspw. das Master/Slave-Modell bei MySQL.

Wäre wohl einen Möglichkeit, sollte aber noch bezahlbar sein

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 13:32:10 von Claus Reibenstein

Christian Franzen schrieb:

> Ok. Das hab ich gerade noch verstande. Dachte aber eigentlich mit PHP könnte
> man nur eine MySQL-Anweisung aufeinmal ausführen.

Darum geht es nicht!

Es geht darum, was passiert, wenn eine der Anweisungen (nach Murphy ist
das immer die letzte) fehlschlägt. Dann müssen alle vorherigen
Änderungen, die zu dieser Transaktion gehören, zurückgenommen werden,
egal, ob sie einzeln oder am Stück an die DB übermittelt wurden. Das
kannst Du selber tun oder aber der DB überlassen.

BEGIN, COMMIT und ROLLBACK helfen Dir weiter.

> Aber sowas brauche ich auf
> jedenfall. Dann komm damit währe ich dann wohl auf InnoDB festgelegt oder?

Ja.

Gruß. Claus

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 16:47:11 von Sebastian Suchanek

Christian Franzen schrieb:

> Ok. Das hab ich gerade noch verstande. Dachte aber eigentlich mit PHP könnte
> man nur eine MySQL-Anweisung aufeinmal ausführen.
> [...]

Pro Skriptinstanz. Aber wenn 1.000 Spieler gleichzeitig 'was kaufen,
hast du 1.000 Skriptinstanzen, die möglicherweise konkurrierende
Zugriffe auf die Datenbank machen. (Siehe Axels Beispiel.)


Tschüs,

Sebastian

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 17:04:14 von Christian Franzen

> UPDATE konto SET guthaben=guthaben-1000 WHERE user_id=0815
> AND guthaben >= 1000
> UPDATE konto SET guthaben=guthaben+1000 WHERE user_id=4711
> UPDATE bestand SET anzahl=anzahl-1 WHERE user_id=4711
> AND item='Rüstung' AND anzahl >= 1
> INSERT INTO ausruestung (user_id, item) VALUES (0815, 'Rüstung')

Hab gerade mal ne Frage zu dieser Transaktion:

1. Ist das Statement wie es so da steht Korrekt, also müsste ich das einfach
alles aneinader hängen und als ein einziges Statement in mysql_query()
packen oder werden die nacheinander ausgeführt. Ich versteh noch nicht ganz
wie ich Mysql sage das diese Statements zusammengehören.

2. Ist zwar nur ein Beipsiel ist mir aber direkt ein Problem bei
aufgefallen. Das erste Statement würde nicht falsch werden wenn der User
keinen 1000 Guthaben hat oder? Dem würden dann zwar die 1000 nicht abgezogen
werden weil er quasi die WHERE Bedingung nicht erfüllt aber ihm würde doch
trotzdem das Item hinzugefügt werden. Oder werden bei Transaktionen UPDATE
Statement die keinen Datensatz verändern auch als "falsch" gewertet, so dass
die Transaktion nicht ausgeführt wird?

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 17:16:26 von Werner Bauer

Christian Franzen schrieb:
> 2. Ist zwar nur ein Beipsiel ist mir aber direkt ein Problem bei=20
> aufgefallen. Das erste Statement würde nicht falsch werden wenn der U=
ser=20
> keinen 1000 Guthaben hat oder? Dem würden dann zwar die 1000 nicht ab=
gezogen=20
> werden weil er quasi die WHERE Bedingung nicht erfüllt aber ihm wür=
de doch=20
> trotzdem das Item hinzugefügt werden. Oder werden bei Transaktionen U=
PDATE=20
> Statement die keinen Datensatz verändern auch als "falsch" gewertet, =
so dass=20
> die Transaktion nicht ausgeführt wird?=20
Commit ist nicht Autocommit. Das Update wäre an sich ok. Aber:
Du musst in deiner Anwendung nach dem Ausführen der Statements=20
entscheiden, ob nun alles ok war, und du die Transaktionen auch=20
"commit"-est oder eben nicht.
Ein anderer, die Datenbank lesender Nutzer sieht die gemachten=20
Änderungen nicht, bis du sie bestätigst.

Werner.

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 17:25:36 von Johannes Vogel

Hi Christian

Christian Franzen wrote:
>> 3 Selects sind minimale Last. Natürlich interessieren aber nicht die 3
>> Selects pro Seite, sondern Anzahl Selects pro Sekunde in Spitzenzeiten
>> und wie lange diese dauern.
> Gehen wir mal von maximal 1000 gleichzeitgen Seitenbesuchern aus, dann
> werden das wohl einige sein.

Naja, auch das macht den Braten noch nicht feiss. Sofern die Queries
nicht aus allen Nähten platzen, kann dir da noch nicht viel passieren.
Ich geh davon aus, dass pro Select so 3, 4 Tabellen abgefragt werden und
alle Indices auch gesetzt und benutzt werden.

>> Explain hilft hier, ob die Indices auch wirklich benutzt werden.
> Versteh jetzt nicht ganz was du mir damit sagen willst?

Das ist eher beängstigend. Falls du obige Aussage nicht verstanden hast,
solltest du dich schleunigst mit Indices und Explain auseinander setzen.
Hier kannst du Rechenzeit sparen. Bevor diese nicht gesetzt sind, wirst
du niemals eine gute Performance hinkriegen. Da nützen auch Stored
Procedures wenig!

>> In der Zwischenzeit habe ich mir mal im Kopf ein bisschen über
>> Browsergames Gedanken gemacht. Das müsste doch eine serverseitige
>> Realtime Discrete Event Machine sein? Und über die Websites ruft man den
>> aktuellen Status ab, bzw. fügt neue Events in die Liste ein.
> Jo so in etwa. Über die Webseite kann man seinen aktuellen "Status"
> anzeigen, also Truppen anzahl, Ressourcen... und neue Events in die
> Datenbank eintragen. Bei jedem Seitenaufruf wird dann geprüft ob seit dem
> letzten Seitenaufruf ein Event stattgefunden hat, also z.B. Truppe hat ihr
> Ziel erreicht oder Gebäude würde fertiggestellt, und wenn ja wird dieses
> bearbeitet

Also werden nur Aktionen ausgeführt, wenn ein User eine Abfrage startet.
Das ist schlecht, denn folgendes Szenario könnte auftreten: Bis 19:00
könnten verschiedene User (1000 gleichzeitige sogar) Aktionen für die
Zeit zwischen 22:00 und 1:00 auslösen. In dieser Zeit ist aber niemand
Online und die Events werden nicht abgearbeitet. Um 1:15 kommt jemand
online und all die Events müssen erst abgearbeitet werden. Das könnten
ja zig tausende sein, was einiges an Zeit kostet, dies aufzuholen.

Stattdessen solltest du darauf achten, dass die Statemachine dauernd im
Einsatz ist und dann die Jobs abarbeitet, wenn sie nötig sind.

Unter Umständen wirst du so trotzdem noch zu Zeiten gelangen, wo so
viele Jobs abgearbeitet werden müssten, dass das System nicht nachkommt.
Es wäre also dann u.U. sinnvoll, Zwischenergebnisse zu managen, so dass
du vorarbeiten kannst. Hmm.. wahrscheinlich ist das alles jetzt etwas
wirr. Ein Beispiel:

Verschiedene User haben Jobs in Auftrag gegeben, welche alle um 22:00
ausgeführt werden müssen. Zusätzlich sind aber um 22:01 wiederum extrem
viele Events auszulösen. Jetzt mag deine Maschine vielleicht zwischen
22:00 nicht nach, um bis 22:01 alle Jobs auszuführen, was dann alles zu
einer Überlast führen kann, so dass bei mehreren solchen Fällen
aneinander gehängt, um 22:10 noch gewisse Aktionen von 22:02 noch nicht
ausgeführt sind.

Jetzt möchte aber der Spieler um 22:10 den aktuellen Status abfragen,
denn er weiss ja, dass jetzt seine Schiffe im Hafen angekommen sein
müssten. Das sind sie tatsächlich aber nicht weil dein System nicht nach
kam mit rechnen.

Es wäre jetzt also toll, wenn die Maschine bereits um 21:40, wenn nicht
so viel los ist, die Rechenarbeit erledigen könnte und um 22:05 einfach
vorgefertige Stati zur Verfügung gestellt wären.

>> Jetzt suchen wir mal Bottlenecks: ServerEngine kann kurzzeitig
>> überlastet werden, wenn viele Leute gleichzeitig Statusänderungen
>> initiierten, die jetzt auszuführen sind. Hier müsste wohl mit
>> Locking-Verfahren verhindert werden, dass falsche Informationen
>> rumgeistern. Die Abarbeitung müsste möglichst über Stored Procedures
>> erfolgen, um der Datentransport zwischen Applikation und Datenbank zu
>> minimieren und die Abarbeiten schneller zu gestalten.
> Hört sich gut an aber Locking-Verfahren und Stored Procedures sagt mir nix

Dir sagt noch manches nix - dünkt mich. Wieso denn ein Online Game
programmieren, wenn dir die Grundlagen noch nicht klar sind? Vielleicht
wäre was einfacheres erst fällig?

>> Weiter könnte es beim Userinterface Probleme bei der Netzanbindung
>> geben. Das ist hier aber nicht Thema.
> Was meinst du damit?

Naja, Bildchen, Code, etc. braucht alles viele Bits und Bytes, welche
über das Netz verschickt werden wollen. Bei einigen tausend Spielern
kann das schwer ins Gewicht fallen. Eine superschnelle Leitung - oder
eben mehrere davon - könnten nötig sein. Das hat aber mit DBs nichts zu tun.

>> Vielleicht solltest du deshalb die beiden Teile auch auf zwei oder mehr
>> Server aufteilen, falls du wirklich viele Anfragen kriegst. Dazu gibt's
>> bspw. das Master/Slave-Modell bei MySQL.
> Wäre wohl einen Möglichkeit, sollte aber noch bezahlbar sein

Naja, du willst ohne Wissen, ohne Geld und wohl ohne Ressourcen viel...

Mir hat's gefallen, mir darüber Gedanken zu machen. Aber vielleicht
solltest auch du dir noch einige Gedanken machen?
HTH, Johannes

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 17:43:43 von Axel Schwenke

"Christian Franzen" wrote:
>
>> UPDATE konto SET guthaben=guthaben-1000 WHERE user_id=0815
>> AND guthaben >= 1000
>> UPDATE konto SET guthaben=guthaben+1000 WHERE user_id=4711
>> UPDATE bestand SET anzahl=anzahl-1 WHERE user_id=4711
>> AND item='Rüstung' AND anzahl >= 1
>> INSERT INTO ausruestung (user_id, item) VALUES (0815, 'Rüstung')
>
> Hab gerade mal ne Frage zu dieser Transaktion:
>
> 1. Ist das Statement wie es so da steht Korrekt, also müsste ich das einfach
> alles aneinader hängen und als ein einziges Statement in mysql_query()
> packen oder werden die nacheinander ausgeführt. Ich versteh noch nicht ganz
> wie ich Mysql sage das diese Statements zusammengehören.

http://dev.mysql.com/doc/refman/5.0/en/commit.html

> 2. Ist zwar nur ein Beipsiel ist mir aber direkt ein Problem bei
> aufgefallen. Das erste Statement würde nicht falsch werden wenn der User
> keinen 1000 Guthaben hat oder?

Richtig. Das ist schon eine Optimierung, weil es das SELECT spart, das
man sonst bräuchte um nachzusehen, ob der User überhaupt genug Geld
hat. Wenn man Schulden erlaubt, braucht man den Check natürlich nicht.

> Dem würden dann zwar die 1000 nicht abgezogen
> werden weil er quasi die WHERE Bedingung nicht erfüllt aber ihm würde doch
> trotzdem das Item hinzugefügt werden. Oder werden bei Transaktionen UPDATE
> Statement die keinen Datensatz verändern auch als "falsch" gewertet, so dass
> die Transaktion nicht ausgeführt wird?

Nun, was oben noch fehlt, ist die Logik hinter der Transaktion. Von
allein rollt die sich nicht zurück, dazu mußt *du* schon das ROLLBACK
ausführen. Dein Programm müßte also z.B. nach dem ersten UPDATE prüfen,
ob affected_rows == 1 ist und nur dann weiter machen.

In Pseudocode:

if (abbuchen(kunde, betrag) &&
aufbuchen(händler, betrag) &&
nimm_ware(händler, item) &&
gib_ware(kunde, item)
)
then
commit()
else
rollback()


XL

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 18:10:49 von Claus Reibenstein

Christian Franzen schrieb:

>> UPDATE konto SET guthaben=guthaben-1000 WHERE user_id=0815
>> AND guthaben >= 1000
>> UPDATE konto SET guthaben=guthaben+1000 WHERE user_id=4711
>> UPDATE bestand SET anzahl=anzahl-1 WHERE user_id=4711
>> AND item='Rüstung' AND anzahl >= 1
>> INSERT INTO ausruestung (user_id, item) VALUES (0815, 'Rüstung')
>
> Hab gerade mal ne Frage zu dieser Transaktion:

Noch ist das keine Transaktion. Da fehlen noch BEGIN und COMMIT (bzw.
ROLLBACK im Fehlerfall).

Bitte nimm _endlich_ ein Handbuch und schaue nach, was es damit auf sich
hat. Es ist einfach ärgerlich, wenn man Hinweise gibt und 3 1/2 Stunden
später feststellen muss, dass die Hinweise einfach ignoriert werden.

Gruß. Claus

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 19:56:50 von Christian Franzen

>>> Explain hilft hier, ob die Indices auch wirklich benutzt werden.
>> Versteh jetzt nicht ganz was du mir damit sagen willst?
>
> Das ist eher beängstigend. Falls du obige Aussage nicht verstanden hast,
> solltest du dich schleunigst mit Indices und Explain auseinander setzen.
> Hier kannst du Rechenzeit sparen. Bevor diese nicht gesetzt sind, wirst
> du niemals eine gute Performance hinkriegen. Da nützen auch Stored
> Procedures wenig!

Jo, werd ich wohl müssen!

> Also werden nur Aktionen ausgeführt, wenn ein User eine Abfrage startet.
> Das ist schlecht, denn folgendes Szenario könnte auftreten: Bis 19:00
> könnten verschiedene User (1000 gleichzeitige sogar) Aktionen für die
> Zeit zwischen 22:00 und 1:00 auslösen. In dieser Zeit ist aber niemand
> Online und die Events werden nicht abgearbeitet. Um 1:15 kommt jemand
> online und all die Events müssen erst abgearbeitet werden. Das könnten
> ja zig tausende sein, was einiges an Zeit kostet, dies aufzuholen.

Wollte ich lösen indem ich alle 5-10 min über einen CronJob ein Skript
laufen lasse, dass die events abarbeitet damit die sich nicht anhäufen
können.

> Dir sagt noch manches nix - dünkt mich. Wieso denn ein Online Game
> programmieren, wenn dir die Grundlagen noch nicht klar sind? Vielleicht
> wäre was einfacheres erst fällig?

Hab nur nicht wirklich viel Ahnung von MySQL, hab damit bisher nur sehr
einfach gearbeitet als mehr als einfache SELECT, INSERT und UPDATE waren
bisher noch nicht drin. Der Rest geht mir so von der Hand. Aber MySQL wird
nun nicht das Problem sein. So viel kann es da nicht neues zu lernen geben.

>>> Weiter könnte es beim Userinterface Probleme bei der Netzanbindung
>>> geben. Das ist hier aber nicht Thema.
>> Was meinst du damit?
>
> Naja, Bildchen, Code, etc. braucht alles viele Bits und Bytes, welche
> über das Netz verschickt werden wollen. Bei einigen tausend Spielern
> kann das schwer ins Gewicht fallen. Eine superschnelle Leitung - oder
> eben mehrere davon - könnten nötig sein. Das hat aber mit DBs nichts zu
> tun.

Aso. Ja jetzt habs ichs verstanden. Leitung sollte kein Problem werden.

>>> Vielleicht solltest du deshalb die beiden Teile auch auf zwei oder mehr
>>> Server aufteilen, falls du wirklich viele Anfragen kriegst. Dazu gibt's
>>> bspw. das Master/Slave-Modell bei MySQL.
>> Wäre wohl einen Möglichkeit, sollte aber noch bezahlbar sein
>
> Naja, du willst ohne Wissen, ohne Geld und wohl ohne Ressourcen viel...

Ganz genau. Obwohl das "Ohne Wissen" sich zum Glück nur auf MySQL
beschränkt. Aber anfangs wird der Server wohl eh was kleiner ausfallen und
wir werden einfach weniger User zulassen. Dann halten sich die Kosten schon
in Grenzen.

> Mir hat's gefallen, mir darüber Gedanken zu machen. Aber vielleicht
> solltest auch du dir noch einige Gedanken machen?
> HTH, Johannes

Um mir Gedanken zu machen bin ich ja hier. Wenn es dir so viel Spaß macht,
weiß ich ja an wenn ich mich demnächst mit MySQL Fragen richte :)

mfg Xion

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 20:08:35 von Christian Franzen

Ok. Ich glaub jetzt hab ich es verstanden. Des beste wird wohl trotzdem
sein, bevor ich mich hier weiter auslasse, das MySQL Manual erstmal komplett
zu lesen. Ist ja nicht mehr schön wie wenig Ahnung ich hab. :

mfg Xion

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 20:10:18 von Christian Franzen

> Bitte nimm _endlich_ ein Handbuch und schaue nach, was es damit auf sich
> hat. Es ist einfach ärgerlich, wenn man Hinweise gibt und 3 1/2 Stunden
> später feststellen muss, dass die Hinweise einfach ignoriert werden.

Ja, hast ja recht. Hab gehofft ich könnte es schnell überblicken. Mir war
nicht klar wie sich MySQL inzwischen entwickelt hat.

mfg Xion

Re: Datenbank Engine? Serverauslastung?

am 24.10.2006 21:41:48 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Datenbank Engine? Serverauslastung?

am 25.10.2006 02:14:15 von Johannes Vogel

Hi Christian

Christian Franzen wrote:
> Ok. Ich glaub jetzt hab ich es verstanden. Des beste wird wohl trotzdem
> sein, bevor ich mich hier weiter auslasse, das MySQL Manual erstmal komplett
> zu lesen. Ist ja nicht mehr schön wie wenig Ahnung ich hab. :

Das komplett zu lesen - na, da hast du dir aber was vorgenommen!

Ich würd mal einfach drauslos programmieren, die Probleme kommen dann
alle gleichzeitig und plötzlich wirst du über alles Bescheid wissen und
auch wozu du dir vorher Gedanken hättest machen sollen. Naja, dann
kannst du deine Applikation zum Fenster rauswerfen und nochmals von neu
beginnen. So lernt sich's am einfachsten.

Ich finde das ein wunderbarer Plan. :-)
Johannes

Re: Datenbank Engine? Serverauslastung?

am 25.10.2006 21:54:47 von Christian Franzen

> Das komplett zu lesen - na, da hast du dir aber was vorgenommen!

Ich werd es nicht komplett Lesen. Hab schon mal was durchgeblättert und
bereits schonmal ne auswahl getroffen. Die Grundlagen von SQL Queys kenn ich
ja außerdem schon.

> Ich würd mal einfach drauslos programmieren, die Probleme kommen dann
> alle gleichzeitig und plötzlich wirst du über alles Bescheid wissen und
> auch wozu du dir vorher Gedanken hättest machen sollen. Naja, dann
> kannst du deine Applikation zum Fenster rauswerfen und nochmals von neu
> beginnen. So lernt sich's am einfachsten.

Vielleicht mach ich es wirklich so. Werd das ganze objektorientiert coden
dann sind änderungen an den SQL Querys ja recht leicht einzupflegen.