. .

Schnelles Access-Logging mit MYSQL

Der gemeine SEO will nach Möglichkeit alle Keywords loggen die Besucher auf seine Seite brachten und viele SEO’s nutzen für diese Aufgabe Google-Analytics oder Etracker. Schlecht sind die Tools nicht, aber man kann leider nicht mit SQL-Statements auf die dort gespeicherten Daten zugreifen und die Interfaces der mächtigen Trackingtools und auch ihre großen Javascripts brauchen leider auch oft mächtig Lange zum Laden.

Bei Alinki loggen setzen wir neben Analytics auf eigenes Logging und dies schnell und effektiv zu tun ist eine echte Herausforderung da in kurzer Zeit eine Menge an Daten auf einen zukommen kann. Unsere Überlegungen für ein Datenbanklayout zum Loggen von großen Datenmengen möchte ich an dieser Stelle teilen:

Die INSERTS in die logging Tabelle logtable sollen möglichst schnell und performant sein damit sie so schnell wie möglich abgearbeitet werden können. Als Tabellentyp bietet sich zu diesem Zweck MyISAM an, da INSERT DELAYED verwendet werden kann. INSERT DELAYED sorgt dafür, dass der Datenbankserver den Datensatz sofort annimmt, diesen in einer Warteschlange zwischenspeichert und diesen sobald kein anderer Prozess mehr auf die Tabelle zugreift schreibt. Damit auch die Schreiboperation selbst performant bleibt sollte bei der logtable darüber hinaus auch auf Keys verzichtet werden, da deren Pflege Schreiboperationen extrem verlangsamt.

Da man auf einer solchen logtable aber mangels Keys nicht arbeiten kann, bietet es sich an eine indexierte Tabelle logtable_index zu erstellen. Aus Gründen der Datensicherheit, der besseren Leseperformance und ROW-Locking bietet sich hierbei INNODB als Tabellentyp an. Die Tabelle sollte eine eindeutige ID und natürlich die richtigen Keys für spätere Leseoperationen haben.

Kommen wir nun zum wohl wichtigsten Punk: Die Daten aus logtable müssen zyklisch und effektiv in logtable_index verschoben werden. Dies geschieht am besten über einen Cronjob, der dies mit den richtigen SQL-Statements erledigt. Bei Alinki übertragen wir neue Daten einmal pro Stunde (mit einem zeitlichen Versatz von einer Stunde) in die indexierte Tabelle und machen und hierbei ein in beiden Tabellen vorhandenes Feld “creationdate” zunutze. Folgende zwei SQL-Statements erledigen diese Aufgabe schnell und zuverlässig:

INSERT INTO logtable_index (creationdate, <weitere Felder>) SELECT creationdate, <weitere Felder> FROM logtable WHERE creationdate < DATE_FORMAT(DATE_SUB(now(), INTERVAL 1 HOUR), ‘%Y-%m-%d %H:00:00′);

DELETE FROM logtable WHERE creationdate < DATE_FORMAT(DATE_SUB(now(), INTERVAL 1 HOUR), ‘%Y-%m-%d %H:00:00′);

Aktualisiert am 3. November 2008
Kategorie Technik