[php,sql] c-plusplus.de forum index schneller machen
-
Ich hab keine Ahnung von PHP, aber ist es nicht möglich, dass das "last-topic" nicht bei jedem Seitenaufruf, sondern konstant alle 3 Sekunden berechnet wird?
-
Nimm den Mod raus und guck ob es besser wird
-
Vielleicht es mit ein paar Indizes probieren?
-
Welche Datenbank habt ihr eigentlich?
-
Erstmal ne Frage:
Was bezweckst Du mitwhile( $row = $db->sql_fetchrow($result) ) { if($row['topic_last_post_id'] != $last_topic_id || $row['topic_last_post_id'] == 0) { $last_topic_id = $row['topic_last_post_id']; $forum_data[] = $row; } }
Warum liest Du das ganze dann überhaupt aus der DB. wenn Du es eh wieder eliminierst?
Und nun noch ein paar Anmerkungen:
1. Schmeiß die komplette DB-Layer-Unterscheidung raus! Du verwendest wahrscheinlich eh nur ein einziges DBMS, also kannst Du die komplette DB-Klasse ersetzen.
2. Entferne alle großen Kommentar-Blöcke. Der verursachte Overhead bei der Ladezeit ist bei großen Projekten durchaus relevant.
3. Deine Zensurfunktion lässt sich wahrscheinlich auch noch optimieren. Wenn ich richtig rate, dann liefert Dir obtain_word_list() doch einen Satz verschiedener regulärer Ausdrücke, diese könntest Du jedoch in einem einzigen zusammenfassen und somit einen leichten Performance-Gewinn herausholen.
4. Fasse Deine SQL-Queries in Hochkommata und nicht in Anführungszeichen.
5. Ich bin jetzt mit dem Source des zugrunde liegenden Board-Systems nicht so vertraut, aber der gepostete Teil erweckt den Eindruck, daß man das Array $forum_data evtl. komplett eliminieren kann. Prüfe das doch mal nach.Gruß Jens
-
ah, gleich schon viel schneller
-
Marc++us schrieb:
Also, ich denke die Datenbankabfrage -hat- das Potential.
da hilft mir mein c++ wissen nicht weiter
Unregistrierter schrieb:
Ich hab keine Ahnung von PHP, aber ist es nicht möglich, dass das "last-topic" nicht bei jedem Seitenaufruf, sondern konstant alle 3 Sekunden berechnet wird?
das ist in php nicht so leicht möglich, außerdem wahrscheinlich langsammer
Unregistrierter schrieb:
Nimm den Mod raus und guck ob es besser wird
ja leider
O'Dog schrieb:
Vielleicht es mit ein paar Indizes probieren?
was ist das?
O'Dog schrieb:
Welche Datenbank habt ihr eigentlich?
mysql 3.xx
Sa(n)dman schrieb:
Erstmal ne Frage:
Was bezweckst Du mitwhile( $row = $db->sql_fetchrow($result) ) { if($row['topic_last_post_id'] != $last_topic_id || $row['topic_last_post_id'] == 0) { $last_topic_id = $row['topic_last_post_id']; $forum_data[] = $row; } }
ab und zu kommt ein daten satz doppelt im row vor (wahrscheinlich falscher sql code, aber ich müsste mich dann doch mehr mit sql befassen)
Warum liest Du das ganze dann überhaupt aus der DB. wenn Du es eh wieder eliminierst?
was meinst du
Und nun noch ein paar Anmerkungen:
1. Schmeiß die komplette DB-Layer-Unterscheidung raus! Du verwendest wahrscheinlich eh nur ein einziges DBMS, also kannst Du die komplette DB-Klasse ersetzen.finde ich nicht gut
2. Entferne alle großen Kommentar-Blöcke. Der verursachte Overhead bei der Ladezeit ist bei großen Projekten durchaus relevant.
so viel komentare sind da nicht drin
3. Deine Zensurfunktion lässt sich wahrscheinlich auch noch optimieren. Wenn ich richtig rate, dann liefert Dir obtain_word_list() doch einen Satz verschiedener regulärer Ausdrücke, diese könntest Du jedoch in einem einzigen zusammenfassen und somit einen leichten Performance-Gewinn herausholen.
ja aber dann kann ich alles nur zu eins umwandeln, es soll aber z.b. standart in standard umwandeln
4. Fasse Deine SQL-Queries in Hochkommata und nicht in Anführungszeichen.
ich will erstmal die high-level optimierung machen
5. Ich bin jetzt mit dem Source des zugrunde liegenden Board-Systems nicht so vertraut, aber der gepostete Teil erweckt den Eindruck, daß man das Array $forum_data evtl. komplett eliminieren kann. Prüfe das doch mal nach.
wenn ich wollte könnte ich ja das forum hardcoden in den php dateien finde ich aber nicht so toll, denke nicht das man forum_data killen kann
-
Dimah schrieb:
O'Dog schrieb:
Vielleicht es mit ein paar Indizes probieren?
was ist das?
Der Plural von Index
http://www.mysql.com/doc/en/MySQL_indexes.html
Bringt 'ne Menge auf Spalten worüber Tabellen ge-joined werden oder auch einfach nur bei Abfragen von Spalten-Werten...wenn die Tabellen viele Sätze haben
-
ich verstehe nicht ganz wo das problem ist. jetzt wo du es rausgenommen hast, stehen doch auch Benutzername, Datum und Uhrzeit unter "Letzter Beitrag". Da wird es doch wohl kein Problem sein auch den Topic-Namen mitzuspeichern
-
Anonymous schrieb:
ich verstehe nicht ganz wo das problem ist. jetzt wo du es rausgenommen hast, stehen doch auch Benutzername, Datum und Uhrzeit unter "Letzter Beitrag". Da wird es doch wohl kein Problem sein auch den Topic-Namen mitzuspeichern
ohne den code und die db strucktur des phpbbs zu verändern?
-
Hast du schonmal probiert die Reihenfolge der einzelnen JOINs zu verändern - könnte evtl. schon etwas bringen (siehe dazu auch das hier)
-
der phpbb code scheint mir ein graus zu sein...
ich wuerde es brutal machen:
eine neue tabelle erstellen die exakt soviele eintraege hat wie wir foren.
bei jedem neuen posting wird brutal ein update ausgefuehrt unnd setzt in dieser tabelle den titel des letzten postings.
da kannst du uhrzeit und user id auch dazu geben, dann bist du extrem schnell, da du mit einem query alles bekommst.allerdings musst du dann die struktur aendern, was sich aber IMHO auszahlt. denn ich wuesste nicht wie man es anders effektiv schaffen koennte.
-
Shade Of Mine schrieb:
der phpbb code scheint mir ein graus zu sein...
ich wuerde es brutal machen:
eine neue tabelle erstellen die exakt soviele eintraege hat wie wir foren.
bei jedem neuen posting wird brutal ein update ausgefuehrt unnd setzt in dieser tabelle den titel des letzten postings.
da kannst du uhrzeit und user id auch dazu geben, dann bist du extrem schnell, da du mit einem query alles bekommst.allerdings musst du dann die struktur aendern, was sich aber IMHO auszahlt. denn ich wuesste nicht wie man es anders effektiv schaffen koennte.
ungern, denn das bedeutet viele eingriffe in den orginal code, was sich negativ beim updaten auswirkt
-
Sollten doch nur 2 Eingriffe sein? Einmal dort wo Posting in Empfang genommen wird und einmal auf der Index-Seite.
Man muss ja nicht unbedingt eine Datenbank nehmen. Für jedes Forum eine eigene Textdatei sollte doch auch gehen, oder?
Also z.B. f_1.txt:
ie starten abcqurz 16 Jul 2003 07:54 MuehBln
Am Besten 2 Funktionen schreiben und die in eine separate Datei packen (z.B. SetLastPosting(forum). Das kann man dann ja schnell wieder rein/rausbauen.
btw: C/C++ Code und Code haben die selbe Tastenkombination (Alt+c)
-
Dimah schrieb:
Shade Of Mine schrieb:
der phpbb code scheint mir ein graus zu sein...
ich wuerde es brutal machen:
eine neue tabelle erstellen die exakt soviele eintraege hat wie wir foren.
bei jedem neuen posting wird brutal ein update ausgefuehrt unnd setzt in dieser tabelle den titel des letzten postings.
da kannst du uhrzeit und user id auch dazu geben, dann bist du extrem schnell, da du mit einem query alles bekommst.allerdings musst du dann die struktur aendern, was sich aber IMHO auszahlt. denn ich wuesste nicht wie man es anders effektiv schaffen koennte.
ungern, denn das bedeutet viele eingriffe in den orginal code, was sich negativ beim updaten auswirkt
update wird ja wohl nicht mehr nötig sein
-
Dimah schrieb:
ungern, denn das bedeutet viele eingriffe in den orginal code, was sich negativ beim updaten auswirkt
ja, das ist leider der nachteil
aber ich habe mich gestern 1 stunde mit dieser datenbank sttruktur gespielt -> ich habs nicht hinbekommen mit dieser struktur den letzten beitrag effizient auszulesen.
du kannst ja auch mal auf phpbb.com nachfragen wie man das effizient machen kann.
wie gesagt, dass ist der einzige weg der mir eingefallen ist -> hoffentlich findet noch jemand einen besseren!
-
Vielleicht solltet ihr es doch mal mit nem Index auf die größeren Tabellen machen. Die Spalten die in dem SQL vorkommen halt in Kombination
-
Warum nicht einfach für jedes Forum eine schöne Tabelle - das ist ja kein Problem?! Und da lässt man dann brav einen Index mitlaufen (Unique oder so) und ruft einfach Element #1 für jede Tabelle auf?
Außerdem erleichtert das das Suchen in einzelnen Foren!
MfG SideWinder
-
kann man performancekritische Sachen nicht in C++ schreiben?
-
Die SQL-Abfrage ist zeitkritisch, und mySQL ist doch in C++ geschrieben.
Ein Join über soviele Tabellen dauert... egal ob VB, C++ oder PHP.