phpBB langsam? oder Wie Mysql Slow Queries auslesen?

Probleme bei der regulären Arbeiten mit phpBB, Fragen zu Vorgehensweisen oder Funktionsweise sowie sonstige Fragen zu phpBB im Allgemeinen.
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.1, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

ich gehe gerade step-by-step alles durch.

Als Verständnis. Der geht die Datenbank durch um "gewöhnliche" Wörter aus der Datenbank rauszuschmeißen. Und das macht der bei jedem neuen Post. Was ich schon alleine komisch finde aber egal.

Also hier nochmal der Übeltäter:

Code: Alles auswählen

$sql = "SELECT m.word_id 
				FROM " . SEARCH_MATCH_TABLE . " m, " . SEARCH_WORD_TABLE . " w 
				WHERE w.word_text IN ($word_id_sql)  
					AND m.word_id = w.word_id 
				GROUP BY m.word_id 
				HAVING COUNT(m.word_id) > $common_threshold";
Er sucht nun die Übereinstimmungen in w.word_text mit den angelieferten Wörtern aus $word_id_sql (die teilweise ungefilterte Wörter enthält, aber darauf komme ich später zurück), dann werden die Wörter nach ihrer Anzahl gruppiert, wobei aber nur die Wörter ausgelesen werden die mindestens so oft vorkommen wie es $common_threshold vorschreibt.

Danach werden diese Daten weiter verarbeitet. Erst werden die als "gewöhnlich" erkannten Wörter hier gekennzeichnet:

Code: Alles auswählen

			$sql = "UPDATE " . SEARCH_WORD_TABLE . "
				SET word_common = " . TRUE . " 
				WHERE word_id IN ($common_word_id)";
Danach in einer weiteren Tabelle entfernt:

Code: Alles auswählen

$sql = "DELETE FROM " . SEARCH_MATCH_TABLE . "  
				WHERE word_id IN ($common_word_id)";
Geht man nun in meinem Forum hin und sucht mal nach Wörtern, die gewöhnlich sind, fällt einem ins Auge, dass nicht ein einziges Wort als gewöhnlich erkannt wurde. Da drängt sich mir direkt die Frage auf, nach dem Sinn dieser Funktion.

Laut der Formel ist ein Wort nur dann gewöhnlich, wenn es in einem Viertel aller Posts vorkommt. D.h. es muss in 4 von 10 Posts vorkommen, damit wir uns von diesem Wort trennen können:

Code: Alles auswählen

$common_threshold = floor($row['total_posts'] * $fraction);
Ist es nicht auch schon hier das Problem, dass Wörter, die in 4 von 10 Posts vorkommen einen zu kleinen Maßstab darstellen?

Suche ich nun dank der Abfrage aus der Dokunach den häufigsten Wörtern in meinem Forum so bekomme ich z.B. diese Top 10:

Code: Alles auswählen

17 ich 101579 
27 und 87074 
65 die 84334 
6 das 83042 
34 der 70004 
272 ist 62721 
93 auch 62422 
113 nicht 57311 
87 aber 57225 
41 mal 50313
Das schlägt sich dann durch bis zu einer Anzahl von ca. 15.000 Vorkommnissen.

Also ist es bei mir tatsächlich so, dass mein "Gewöhnlichkeitsindex" 1/40 beträgt. Also wenn das Wort in zehn von 400 Beiträgen auftaucht, dann ist es gewöhnlich.

Ich könnte nun zwei Wege einschlagen. Einmal ich übernehme die gewöhnlichen Wörter in meine search_stopwords.txt und baue den Suchindex neu auf oder ich ändere die Formel für den Gewöhnlichkeitsindex.

Doch diese Änderung würde mir nicht wirklich weiterhelfen, denn die Abfrage würde ja in Zukunft dennoch generiert werden.

Also behaupte ich mal frech, dass diese Funktion eigentlich eine unnütze Bremse in phpBB ist (da sie ja eh nie greift) und die manuelle Änderung und Übernahme der Wörter in die stopwords viel hilfreicher wäre, da dann gar keine Abfrage generiert wird.

Was mich aber immer noch beschäftigt ist, dass sowohl die Wörter aus meiner "Top 10", der gewöhnlichsten Wörter und die Wörter die allgemein in der Abfrage sind gar nicht darin auftauchen dürften, da sie eh schon in der stopwords stehen. Also suche ich mal weiter...

Aber vorerst habe ich den Gewöhnlichkeitsindex in meiner search_functions.php verändert:

Code: Alles auswählen

	if ($mode == 'single')
	{
		remove_common('single', 1/40, $word);
	}
EDIT1:
In einem Post, der Übersichtlichkeit halber:

Ich hab in der functions_search.php mal versucht herauszufinden warum die stopwords eigentlich nicht greifen und das kann ich mir gerade mal überhaupt nicht erklären.

Also diesen Code habe ich platziert:

Code: Alles auswählen

	if ( !empty($stopword_list) )
	{
		for ($j = 0; $j < count($stopword_list); $j++)
		{
			$stopword = trim($stopword_list[$j]);

			if ( $mode == 'post' || ( $stopword != 'not' && $stopword != 'and' && $stopword != 'or' ) )
			{
				$entry = str_replace(' ' . trim($stopword) . ' ', ' ', $entry);
// mein Code zur Prüfung
if ($user->data['user_id'] == 2)
{
	echo('Der zu verarbeitende Eintrag: "');
	echo($entry . '"<br />');
	echo('Das erste Wort was zu ersetzen ist: "');
	echo($stopword . '"<br />');
	exit;
}
// Ende mein Code
			}
		}
	}
Tatsächlich greift die str_replace() nicht. Angezeigt wird auf der Seite das:
[ externes Bild ]

Dann lasse ich mir den Quelltext anzeigen:
[ externes Bild ]

Sehe ich das richtig?! Japanisch?!

Übrigens sieht der Spaß in Firefox ähnlich komisch aus:
[ externes Bild ]

Na was sagt ihr :lol:



EDIT2:

Tja, man glaubt es kaum. Das Problem ist simpel und wurde gelöst:

Die search_stopwords.txt hatte kein Format angegeben. Also sie war als reiner Datencontainer auf dem Server angegeben. Nun ist sie geändert auf plaintext und schon klappts. Nur dumm, dass das jetzt heißt, dass ich den kompletten Suchindex neu aufbauen muss.

Naja. Aber dann sollte der Server wieder rennen.

Gruß
Zuletzt geändert von mgutt am 03.10.2006 19:26, insgesamt 1-mal geändert.
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

*delete*
Zuletzt geändert von mgutt am 03.10.2006 19:26, insgesamt 1-mal geändert.
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
Gumfuzi
Ehemaliges Teammitglied
Beiträge: 2454
Registriert: 26.03.2004 22:25
Wohnort: Linz, AT
Kontaktdaten:

Beitrag von Gumfuzi »

soll das heissen, daß die "stopwords" in den searchtables auch gelistet werden?
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

schau bei "EDIT2".. habe das Problem lösen können.
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
Gumfuzi
Ehemaliges Teammitglied
Beiträge: 2454
Registriert: 26.03.2004 22:25
Wohnort: Linz, AT
Kontaktdaten:

Beitrag von Gumfuzi »

aha, danke!

P.S.: finde es klasse, dass Du Dich mit Optimierungen beschäftigst!!!
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

Ok, jetzt habe ich offensichtlich einen Fehler im Code gefunden. Und zwar kamen beim Neuaufbau des Suchindexes trotzdem noch zweistellige Wörter durch.

Naja dann habe ich den gelieferten Code gefiltert und dabei viel mir auf, dass die preg_replace Zeile fehlerhaft ist:

Code: Alles auswählen

<?php

$entry = 'es ja er es du da';
$entry = ' ' . strip_tags(strtolower($entry)) . ' ';
$entry = preg_replace('/[ ]([\S]{1,2}|[\S]{21,})[ ]/',' ', $entry);
echo($entry);

?>
Ergebnis:

Code: Alles auswählen

ja es da
D.h. wenn nach einem 2-stelligen Wort noch eines folgt wird das folgende nicht herausgefiltert.

Mal sehen, ob das irgendwo schon angesprochen wurde.

Gruß

EDIT: Tatsächlich hat man das schon diskutiert. Aber der Fehler existiert schon seit 2 Jahren in phpBB. Wirklich verstehen kann ich das nicht.
http://www.phpbb.de/viewtopic.php?t=68093
http://www.phpbb.com/phpBB/viewtopic.php?t=208647
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Garfield312
Mitglied
Beiträge: 528
Registriert: 03.09.2004 15:54

Beitrag von Garfield312 »

mgutt hat geschrieben:Tja, man glaubt es kaum. Das Problem ist simpel und wurde gelöst:

Die search_stopwords.txt hatte kein Format angegeben. Also sie war als reiner Datencontainer auf dem Server angegeben. Nun ist sie geändert auf plaintext und schon klappts. Nur dumm, dass das jetzt heißt, dass ich den kompletten Suchindex neu aufbauen muss.
Hallo,

da ich auch teilweise massive Probleme mit der Serverlast habe, frage ich mich, ob diese Lösung, die du da gefunden hast, auch für andere Forenbetreiber hilfreich ist.

Leider geht dein kompletter Beitrag etwas über meinen Wissensstand hinaus.

Kann ich durch irgendeine Aktion an der search_stopwords.txt mein Forum beschleunigen ?

Falls ja, wäre es sehr nett, wenn du das kurz für Doofe erklären könntest :D

Danke :grin:
Viele Grüße, Garfield.
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

Also es war bei mir so, dass die Datei search_stopwords.txt keine Textdatei war, sondern ein Datencontainer. Soll heißen eine Datei ohne Format. Dies passiert eigentlich nur bei falscher Übertragung von Daten auf den Server oder wenn ein Script die Datei geschrieben hat. Ich kann mir das gerade nicht wirklich erklären wie es dazu kam.

Damit Du checken kannst, ob Deine stopwords greifen benutze diese Abfrage in phpmyadmin:

Code: Alles auswählen

SELECT ls.word_id, ls.word_text, COUNT(wm.word_id) as entries FROM `phpbb_search_wordlist` as ls LEFT JOIN `phpbb_search_wordmatch` as wm ON ls.word_id=wm.word_id GROUP BY wm.word_id ORDER BY entries DESC LIMIT 0,10
Sollten nun in der Top10 Wörter auftauchen, die Du auch in der stopword Textdatei hast, dann könnte deine Datei ebenfalls fehlerhaft sein.

Übrigens gibt es zwei Bugs in phpBB. Der eine lässt 2-stellige Wörter durch und der andere auch Wörter der Stopwordsliste.

Diese Bugs habe ich wie hier beschrieben gelöst:
http://www.phpbb.de/viewtopic.php?p=771897#771897

Mein Suchindex baut sich gerade neu auf, danach kann ich Dir sagen, was die Aktion genau gebracht hat. Das dauert aber noch ca. 32 Stunden, da meine Datenbank was größer ist.

Wenn es hilft, hier ist meine erweiterte Stopwordsliste:
http://www.maxrev.de/files/2007/11/search_stopwords.zip

Da sind einige gewöhnliche Begriffe mehr enthalten, als in der originalen von phpBB.de

Gruß
Zuletzt geändert von mgutt am 19.11.2007 16:48, insgesamt 2-mal geändert.
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
thompson
Mitglied
Beiträge: 797
Registriert: 14.11.2002 14:04
Wohnort: irgendwo im süden
Kontaktdaten:

Beitrag von thompson »

das ergebnis würde mich auch näher interessieren. und vor allem was das performance mäßig gebracht hat. halt uns bitte auf dem laufenden.
Garfield312
Mitglied
Beiträge: 528
Registriert: 03.09.2004 15:54

Beitrag von Garfield312 »

Danke für die Antwort.

Mein Server ist allerdings nicht in der Lage, diese Anweisung in phpmyadmin auszuführen. Nach ein paar Minuten wird mir eine Datei "import.php" zum Download angeboten (die leer ist).

Läßt das schon irgendwelche Rückschlüsse zu ?
Viele Grüße, Garfield.
Antworten

Zurück zu „phpBB 2.0: Administration, Benutzung und Betrieb“