DELAYED und IGNORE bei Logeinträgen in die Datenbank
Was ist schneller als eine Datenbank? Sicher keine Datei. Aber in den letzten Jahren mußte ich feststellen, dass der Flaschenhals von 95% aller Webanwendungen an der Schnittstelle von der Programmiersprache und der Datenbank liegt.Um zu wissen woher seine Besucher kommen, und diese Daten gut auswerten zu können, also gut gruppieren zu können, speichere ich auch immer gern meine Besucherdaten in MySQL-Datenbanken.
Man erhöht damit nun aber zusätzlich die Datenbanklast, was nicht dem Sinn dient, denn in erster Linie muß die Anwendung ohne Zeitverzögerung laufen. Die Auswertungen dienen lediglich der Optimierung der Seite.
MySQL stellt viele verschiedene Paramter bereit um jedem Querie seinem Zweck individuell anzupassen. Es gibt hohe und niedrige Prioriäten. Für Logeinträge, wo man keinen Rückgabewert benötigt ist die Option DELAYED gut geeignet. Auch hat dieser keine Prioriät, sondern wird einfach im Speicher hinten angestellt damit erst die wichtigen Optionen abgearbeitet werden können. Bei Fehlern gibt dieser jedoch trotzdem einen Rückgabewert zurück. Auch bei anderen Eintragungen in die Datenbank verwende ich schon immer gern ein IGNORE um auch bei Fehlern keinen Rückgabewert zu bekommen.
Nun während der Testphase eines Programms lasse ich diese Ausgaben zu. Aber wegen eines Unique-Indexes wäre die Fehlerausgabe auf einer Webseite überflüssig und würde sicher den meisten Besuchern auch nicht weiterhelfen.
Beide Optionen sind für Logeinträge in die Datenbank gut geeignet. Natürlich sollte man immer versuchen doppelte Einträge vor ein INSERT mit einem SELECT verhindert. Aber nicht immer ist das der richtige Weg. Wieder einmal bestätigt eine Ausnahme die Regel.
Bei der Kombination von DELAYED und IGNORE habe ich nun festgestellt, dass die Reihenfolge wichtig ist. INSERT DELAYED IGNORE INTO tabelle ist problemlos. Fehler werden ignoriert, und die Prioriät ist wie gewünscht nicht vorhanden. Bei meinem vorherigen ersten Versuch INSERT IGNORE DELAYED INTO tabelle ging jedoch gar nichts mehr. Daher ist die Reihenfolge tätsächlich wichtig.
Korrekte Reihenfolge: INSERT DELAYED IGNORE INTO tabelle

Der Artikel wurde am 21.01.2010 von Stefan Kremz veröffentlicht.
