anpera.net

anpera.net

experimental server @home
Aktuelle Zeit: Do 14 Nov, 2019 06:40

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kleine Frage bzgl. MySQL-Abfrage.
BeitragVerfasst: Fr 07 Mai, 2010 19:01 
Offline
Freak
Freak
Benutzeravatar

Registriert: Di 01 Mai, 2007 13:57
Beiträge: 1634
Wohnort: Dortmund.
Geschlecht: Männlich
LoGD: Lokal.
Skype: josh.hoiul
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.

_________________
Never change a running system. Bullshit! ;)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr 07 Mai, 2010 22:05 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3922
Wohnort: Basel
Geschlecht: Männlich
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();')


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr 07 Mai, 2010 23:33 
Offline
Freak
Freak

Registriert: So 30 Okt, 2005 17:48
Beiträge: 1408
Wohnort: PB
Geschlecht: Männlich
LoGD: http://dav.blood-reaver.de/lotgd/
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

_________________
Mehr oder minder inaktiv


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa 08 Mai, 2010 13:36 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3922
Wohnort: Basel
Geschlecht: Männlich
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa 08 Mai, 2010 16:56 
Offline
Freak
Freak
Benutzeravatar

Registriert: Di 01 Mai, 2007 13:57
Beiträge: 1634
Wohnort: Dortmund.
Geschlecht: Männlich
LoGD: Lokal.
Skype: josh.hoiul
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.ä.!)

_________________
Never change a running system. Bullshit! ;)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen
Du darfst keine Antworten zu Themen in diesem Forum erstellen
Du darfst deine Beiträge in diesem Forum nicht ändern
Du darfst deine Beiträge in diesem Forum nicht löschen
Du darfst keine Dateianhänge in diesem Forum erstellen

Suche nach:
Gehe zu:  
cron
POWERED_BY
Deutsche Übersetzung durch phpBB.de
anpera.net - Impressum