Datenbank belastung durch große Abfrage?

In diesem Forum kann man Fragen zur Programmierung stellen, die bei der Entwicklung von Mods für phpBB 3.0.x oder dem Modifizieren des eigenen Forums auftauchen.
Forumsregeln
phpBB 3.0 hat das Ende seiner Lebenszeit überschritten
phpBB 3.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 3.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf die neuste phpBB-Version, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
Dagtor
Mitglied
Beiträge: 36
Registriert: 11.07.2008 00:12
Wohnort: Bamberg

Datenbank belastung durch große Abfrage?

Beitrag von Dagtor »

Und wieder einmal hab ich eine eher aussergewöhnliche Frage an euch. Ich hoffe auf die gewohnt erstklassige Hilfe ;-)
Mein Anliegen ist zwar Grenzwertig "Off-Topic", aber ich denke bei entsprechenden ANtworten könnte es auch für andere Mod-Bastler hilfreich sein...

Ich hab folgende idee:
Ich möchte für einige eigene MOD's (alle 5 in einer phpbb Installation) einen "Hilf uns beim übersetzen"-MOD bauen. Jetzt steh ich vor der überlegung ob ich mir mit diesem nur das Skript (als TEXT für Manueles einfügen) für die language-Datei generieren lasse oder ob ich die db-Abfrage gleich direkt in meinen MOD einbaue. Dabei ist meine Befürchtung das der SQL-Server bei zu viel traffic in die Knie geht?!? Die SQL-Datenbank läuft auf einem 1GB-Ram Server (permanent) und 2GB(spitze). Ich erwarte eine max. Auslastung die der von phpbb.de zu den hcohfrequentiertesten Zeiten entsprechen dürfte... bei dem einen oder anderen MOD sind das über 300 Variablen die abgefragt werden. Mir fehlt leider die Erfahrung was dies angeht... Ich wäre euch sehr dankbar... Was denkt ihr darüber?

Code: Alles auswählen


$lang_selector            = $user->data['user_lang'];

    $sql = "SELECT *
            FROM " . LANGUAGE_TABLE . '
            WHERE language = ' . (int) 1 . '
                        AND dokument_id = ' . (int) 1;
           $result = $db->sql_query($sql);
            
            while ($row = $db->sql_fetchrow($result))
                {        
                $template->assign_vars(array(
                                        $row['variable']                => $row[$lang_selector],
                                            ));        
                }
    $db->sql_freeresult($result); 
Sport ist ein Privileg der Landlosen
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Re: Datenbank belastung durch große Abfrage?

Beitrag von Pyramide »

Wenn das die einzige Abfrage ist, sehe ich da keine Performanceprobleme. Als Optimierung solltest du noch die Abfrage auf die Spalten beschränken, die du auch wirklich nutzt. Also nicht die Datenbank nach de,en,fr,it,... fragen und dann hinterher alles außer de wieder wegwerfen. Siehe auch http://parseerror.com/sql/select*isevil.html.

Als Faustregel kann man sagen, dass eine Datenbank durch folgende Abfragen überdurchschnittlich stark belastet wird:
  • Abfrage von großen Datenmengen (z.B. select * from phpbb_posts)
  • Suche in Spalten, die keinen Index haben (z.B. SELECT post_id FROM phpbb_posts WHERE post_text LIKE '%hallo%'
  • Komplexe JOINs und Statistiken über große Datenmengen
Neben dem oben beschriebenen SELECT * ist ein weiterer Fehler, den Anfänger häufig machen, Abfragen extrem zu vereinfachen und dafür entsprechend häufiger auszuführen. Beispielsweise zunächst nur SELECT post_id FROM phpbb_posts WHERE topic_id=4711 auszuführen, dann in PHP das Ergebnis zu durchlaufen und dann für jede ID nochmal per SELECT poster_id, forum_id, post_subject WHERE post_id = 0815 weitere Attribute auszulesen. Oder zuerst die posts-Tabelle in einer und danach die topics-Tabelle in einer zweiten Abfrage auszulesen, anstatt einen JOIN zu verwenden. Durch solche Anfragen erhöht sich vor allem der Overhead bei größeren Datenmengen stark, da PHP ständig beim Datenbankserver nachfragen muss.

Generell kann man sagen, dass bei kleinen Datenmengen (wenige KB oder MB große Tabellen) die Dinge aus dem dritten Absatz stärker ins Gewicht Fallen, bei großen Datenmengen eher die aus dem zweiten Absatz. So werden z.B. bei phpBB vereinzelt absichtlich mehrere kleine Datenbankabfragen ausgeführt anstatt einer großen und die meisten Tabellen sind aus Performancegründen so aufgebaut, dass gegen die Normalformen verstoßen wird.
KB:knigge
Antworten

Zurück zu „[3.0.x] Mod Bastelstube“