anpera.net
https://anpera.homeip.net/phpbb3/

Kleine Frage bzgl. MySQL-Abfrage.
https://anpera.homeip.net/phpbb3/viewtopic.php?f=25&t=5148
Seite 1 von 1

Autor:  MySql [ Fr 07 Mai, 2010 19:01 ]
Betreff des Beitrags:  Kleine Frage bzgl. MySQL-Abfrage.

Huhu,

ich schreibe mir derzeit ein "neues" LotGD namens Celester.
Naja, ich möchte generell ein bisschen mehr OOP etc. in die Programmierung einbringen. Das ist bisher auch kein Problem. (DB Class etc.)

Momentan schreibe ich mir eine "Char"-Class. Der Constructor läd automatisch die Userdaten des Users der gerade Spielt. Ok, die Klasse schreibe ich im Moment und genau dazu habe ich eine kleine Frage. :P

Und zwar will ich die Tabelle "accounts" aufspliten. D.h:
Ich habe eine Tabelle "chars_info" in der alle relevanten Daten zum Charakter stehen. (Passwort, Loginname, Adminstufe, Email, ID, etc. pp.)
Dann habe ich noch die Tabelle "chars_value". In dieser werden die Werte für Waldspeciale etc. gespeichert.

Ich lade die beiden Tabellen gleichzeitig. D.h: Generell habe ich die Tabellen aus Gründen der Übersicht von einander getrennt. Allerdings will ich beide Tabellen gleichzeitig laden. Das klappt auch.

$this->bbcode_second_pass_code('', '$query = $db->query('SELECT chars_info.*,chars_value.* FROM chars_info,chars_value WHERE chars_info.id='.$user_id.' AND chars_value.id='.$user_id);')

Nun meine Frage: Wird das Spiel durch die Abfrage von zwei Tabellen verlangsamt oder wirkt es sich genauso aus, als würde ich nur eine Tabelle abfragen?

Bedanke mich schon mal für Eure antworten. :)

Lg,
My.

Autor:  Eliwood [ Fr 07 Mai, 2010 22:05 ]
Betreff des Beitrags:  Re: Kleine Frage bzgl. MySQL-Abfrage.

Benchmarke es doch einfach...

Aber nun gut, die Überlegungen hab ich natürlich auch gemacht, weil ich es genau so auch löse. Die Antwort ist naheliegend: Natürlich ist es langsamer. Wieviel langsamer entscheidet man durch die Programmierung. Verwendet man die alten mysql_*-Funktionen, dann dürfte die benötigte Zeit steiler ansteigen (durch das db_fetch_assoc(), das für jede Zeile aufgerufen werden muss), als wenn man modernere Zugriffstechniken nutzt. Ich löse das ganze (über PDO im Hintergrund) so:
$this->bbcode_second_pass_code('', '
$q = new dbQuery(SELECT cp.name, cp.value FROM characterproperties cp WHERE cp.charid = :charid, array(':charid' => $this->getCharId()));
$q->exec();
$this->data = $q->fetchAll();')

Autor:  Auric [ Fr 07 Mai, 2010 23:33 ]
Betreff des Beitrags:  Re: Kleine Frage bzgl. MySQL-Abfrage.

Ehrlich gesagt sehe ich nicht ganz, wieso die PHP-Implementierung der Datenbankanbindung hier so relevant sein sollte. Es geht ja viel mehr um die Datenauswahl innerhalb der DB und erst dann um die Übertragung und Auswertung.

Klar ist, dass ein Query auf zwei Tabellen erst einmal aufwändiger ist als der auf eine einzelne - immerhin müssen Daten aus anderen Bereichen gelesen werden und ein Teil des Overheads muss doppelt geleistet werden. Allerdings sind relationale Datenbanken auch darauf ausgelegt, Informationen aus mehreren Tabellen zu verknüpfen und aus zu verarbeiten. Da es sich hier auch noch um ein ausgesprochen simples Auswahlkriterium handelt wird die Verlangsamung durch das Aufteilen wohl kaum ins Gewicht fallen.

Viel mehr stellt sich die Frage, warum du die Accountdaten aufteilen möchtest, denn durch ein sinnvolles Tabellenlayout kann das System sogar deutlich schneller werden. Wenn du etwa die Accountdaten danach trennst, ob sie beim normalen Seitenaufruf des gerade aktiven Spielers (immer) benötigt werden oder nur in Sondersituationen nötig sind kannst du die Menge der zu Lesenden Daten in vielen Fällen deutlich reduzieren und das System damit beschleunigen. Felder wie der Avatar, die Charakterbio und ähnliches, die nur auf bestimmten Seiten benötigt werden sind gute Kandidaten für eine Auslagerung. Das Ganze macht natürlich nur Sinn, wenn du nicht bei jedem Aufruf diese Extra-Daten mitlädst sondern diese nur bei Bedarf nachlädst.

Auric

Autor:  Eliwood [ Sa 08 Mai, 2010 13:36 ]
Betreff des Beitrags:  Re: Kleine Frage bzgl. MySQL-Abfrage.

Auric hat geschrieben:
Ehrlich gesagt sehe ich nicht ganz, wieso die PHP-Implementierung der Datenbankanbindung hier so relevant sein sollte. Es geht ja viel mehr um die Datenauswahl innerhalb der DB und erst dann um die Übertragung und Auswertung.


Ich gehe davon aus, dass er immer die Gleiche Menge an Daten aus der Datenbank zieht. Und da kann die Implementierung seitens PHP schon etwas ausmachen - vor allem, wenn man grössere Mengen hat und eine Schleife verwendet, um die Daten zu bekommen.
Aber gut, es ist auch nur eine Schätzung meinerseits, dass fetchAll schneller ist als die Schleife mit fetch_assoc.

Autor:  MySql [ Sa 08 Mai, 2010 16:56 ]
Betreff des Beitrags:  Re: Kleine Frage bzgl. MySQL-Abfrage.

Naja ich will ja nicht auf mehrere Datenbanken bzw. verschiedene Datenbanktypen zugreifen. Deshalb sollte PDO eigentlich nicht in Erwägung gezogen werden. Es seie denn, ich habe PDO falsch verstanden.


Zu den zuladenden Daten:

Die erste Tabelle beinhaltet die UserID , Loginname, Titel (Ohne und mit Farbe), Adminstufe, Passwort, E-Mail Adresse, Level, Waffe & Rüstung, Drachenkills.
Die zweite Tabelle beinhaltet hingegen wiederum die UserID, und die Werte der Waldspeziale.

Prefs, Bio, Avatar etc. werden generell in eine eigene Tabelle exportiert.

Die Aufteilung der Tabellen soll generell auch nur die Übersichtlichkeit der Felder / Werte verbessern. Ich bin derzeit auch am überlegen, ob ich generell nur die Tabelle mit den wichtigsten Daten lade und die anderen Daten immer nur dann nachlade, wenn ich sie auch wirklich brauche. (Im Wald o.ä.!)

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/