Max Großmanns Blog

Ein paar Worte über den Schlagwort-O-Mat

 Start     Impressum  
 (Web, RSS)

Ein paar Worte über den Schlagwort-O-Mat

02.08.2010 19:04

(mit Update, siehe unten)

Seit gestern morgen geht hier fast nichts mehr. Entweder dauerte der Aufruf der Seite bis zu einer Minute, oder die Datenbank lieferte nur noch ein "Too many connections" zurück. Merkwürdigkeiten, wo man hinsieht.

Ich habe mittlerweile immernoch den Schlagwort-O-Mat offline genommen, um mir ein neues Konzept für die Speicherung der Archivwörter auszudenken. Denn laut dem Support meines Hosters war ich an dem Ausfall von mysqld schuld. Das kann eigentlich nicht sein, denn die Applikation hat auch vorher noch nie Probleme gemacht.
Gestern abend habe ich dann das vermeintliche Problem gefunden. Um das zu erklären, muss ich etwas weiter ausholen...

Ich habe eine Datenbank bei meinem Hoster eingerichtet. Diese beinhaltet 2 Tabellen, „woerter“ und „archive“. Die Wörtertabelle („woerter“) wird alle paar Tage geleert, damit immer wieder neue Wörter mal nach oben kommen können. Würde sie nicht geleert werden, hätten aktuelle Wörter wie „Duisburg“ oder „Loveparade“ überhaupt keine Möglichkeit, mal über die großen Zähler von „US“ oder „Menschen“ herauszukommen.
Soweit, so gut. Diese Tabelle bereitet also überhaupt keine Probleme, weil sie nie unberechenbar größer werden kann - sie wird ja schließlich immer mal wieder per TRUNCATE geleert.
Jetzt gibt es aber noch die Archivtabelle („archive“). Sie hat mehrere Felder, die wichtigsten sind „count“, „wort“ und „onTime“. Hier wird für jedes gefundene Wort in den Newsberichten gespeichert, wann es wie oft genannt wurde. Allerdings wird in „onTime“ nicht immer der aktuelle Timestamp per time() eingesetzt, sondern der Timestamp von 00:00 Uhr, damit praktisch für jeden Tag gezählt wird. Theoretisch kann ich also schauen, wieviele Zähler das Wort „Polizei“ (uh, ein schlechtes Beispiel) am 15.04.2010 hatte. Das ist ja auch einer der wichtigsten Aspekte des Schlagwort-O-Maten. Die Archivtabelle wird aber nie geleert, sie soll ja schließlich einen Trend anzeigen können - beziehungsweise das Online-Interface meiner Applikation.
Und genau da liegt offenbar der Hund begraben. Weil meiner Wörtersammler, der normalerweise alle halbe Stunde aufgerufen wird, mit sehr vielen Wörter umgeht, muss er immer in der Archivtabelle gucken, ob das Wort schon einmal heute genannt wurde. Wenn ja, UPDATEt er den Eintrag in der Tabelle mit einem Zähler+1, wenn nein, INSERTet er eine neue Zeile mit dem Zähler 1 und dem Timestamp von heute, 00:00. Und dieser Query, also ob es das Wort schon gibt, dauert sehr lange (namentlich: 2 oder 3 Sekunden). Pro Wort! Das muss man sich mal überlegen. Dadurch verzögert sich das alles - und das mag mein Script überhaupt nicht so gerne.

OK, man muss aber auch verstehen, dass das nicht so schnell funktionieren kann. Die genannte „archive“-Tabelle hat fast 700.000 Zeilen. Ich zum Beispiel finde mich noch nicht mal auf meinem Schreibtisch zurecht - und da will man erwarten, dass MySQL die Tabelle in den Bruchteilen einer Sekunde durchsuchen kann? Ich denke nein. Deshalb muss man sich hier Lösungsansätze ausdenken.

Ich hätte da schon einen: Es gibt nicht nur eine Archivtabelle, sondern genau 26. Für jeden Anfangsbuchstaben eine eigene Tabelle. Dann wäre das wesentlich leichter zu überbrücken - und das Problem wäre für ein paar Jährchen erst mal gelöst. Dann gibt es nicht „archive“, sondern „archiveA“, „archiveB“, „archiveC“, usw. Das könnte funktionieren, ist aber ganz sicher nicht die beste Möglichkeit.

Bis ich eine Lösung gefunden und umgesetzt habe, wird der Schlagwort-O-Mat vorläufig offline bleiben. We apologize for any inconvenience.

Update: Yeah! Vincent hat mir geholfen - ich habe das Feld „wort“ einfach zum Index gemacht. Seitdem gehen alle Sachen wieder mit astronomischer Geschwindigkeit. Super, danke! Damit ist auch das Problem ein für alle mal gelöst.

4 Kommentare

Arno Nym

unmaßgeblich //A56h

Das ist ja mal voll böse.
Noch eine Lösungsmöglichkeit: DELETE *SCNR*

Marc

unmaßgeblich //51Ad

Hast Du mal Indexe auf Deiner archive-Tabelle gelegt? 700.000 Datensätze ist jetzt nicht so der Hit...

Max Großmann

unmaßgeblich //C26l

Ja, wie bereits im Update beschrieben.
(s. unten)

Marc

unmaßgeblich //51Ad

Ist mir gerade aufgefallen und ich weiß nicht, warum das jeder falsch schreibt: Es heißt feed und nicht feeds :D