Seite 1 von 1

Datenbank belastung durch große Abfrage?

Verfasst: 10.02.2011 23:58
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); 

Re: Datenbank belastung durch große Abfrage?

Verfasst: 11.02.2011 21:11
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.