444 MySQL - Technische Referenz f¨ur Version 5.0.1-alpha
Die ist ein h¨aufiges Problem, wenn Sie MySQL zum Loggen benutzen und gelegentlich
SELECT- und UPDATE-Statements laufen lassen, die lange Zeit ben¨otigen. DELAYED wurde in
MySQL-Version 3.22.15 eingef¨uhrt. Es ist eine MySQL Erweiterung zu ANSI-SQL92.
INSERT DELAYED funktioniert nur bei ISAM- und MyISAM-Tab ellen. Beachten Sie: Weil
MyISAM-Tabellen gleichzeitige SELECT und INSERT unterst¨utzen, wenn es keine freien Bl¨ocke
mitten in der Daten-Datei gibt, m¨ussen Sie INSERT DELAYED bei MyISAM nur sehr selten
benutzen. Siehe Abschnitt 8.1 [MyISAM], Seite 483.
Wenn Sie INSERT DELAYED benutzen, erh¨alt der Client sofort ein Okay, und die Zeile wird
eingef¨ugt, wenn die Tabelle nicht mehr durch einen anderen Thread in Benutzung ist.
Ein weiterer großer Vorteil von INSERT DELAYED ist, dass Einf¨ugeoperationen vieler Clients
geb¨undelt und in einem Block geschrieben werden. Das ist viel schneller als viele separate
Inserts durchzuf¨uhren.
Beachten Sie, dass momentan die Zeilen in der Warteschlange solange nur im Arbeitsspeicher
gehalten werden, bis sie in die Tabelle eingef¨ugt sind. Das heißt, wenn Sie mysqld auf
die harte Tour killen (kill -9) oder wenn mysqld unerwartet stirbt, sind Zeilen in der
Warteschlange, die noch nicht auf Festplatte geschrieben wurden, verloren!
Im Folgenden ist detailliert beschrieben, was geschieht, wenn Sie die DELAYED-Option f¨ur
INSERT oder REPLACE benutzen. In dieser Beschreibung ist der “Thread” der Thread,
der einen INSERT DELAYED-Befehl empf¨angt. “Handler” ist der Thread, der alle INSERT
DELAYED-Statements f¨ur ein bestimmte Tabelle handhabt.
• When ein Thread ein DELAYED-Statement f¨ur eine Tabelle ausf¨uhrt, wird ein Handler-
Thread erzeugt, um alle DELAYED-Statements f¨ur die Tabelle auszuf¨uhren, wenn ein
solcher Handler nicht schon existiert.
• Der Thread pr¨uft, ob der Handler bereit eine DELAYED-Sperre erhalten hat oder nicht.
Wenn nicht, weist es den Handler-Thread an, das zu tun. Die DELAYED-Sperre kann
selbst dann erlangt werden, wenn ein anderer Thread eine READ- oder WRITE-Sperre auf
der Tabelle hat. Der Handler wartet jedoch auf alle ALTER TABLE-Sperren oder FLUSH
TABLES, um sicherzustellen, dass die Tabellenstruktur aktuell ist.
• Der Thread f¨uhrt das INSERT-Statement aus, aber statt die Zeile in die Tabelle zu
schreiben stellt er eine Kopie der endg¨ultigen Zeile in eine Warteschlange, die vom
Handler-Thread verwaltet wird. Alle Syntaxfehler werden vom Thread erkannt und
dem Client-Programm mitgeteilt.
• Der Client kann die Anzahl von Duplikaten oder den AUTO_INCREMENT-Wert f¨ur die re-
sultierende Zeile nicht mitteilen. Er kann Sie vom Server nicht erhalten, weil das INSERT
zur¨uckkehrt, bevor die Einf¨ugeoperation fertig ist. Wenn Sie die C-API benutzen, gibt
die mysql_info()-Funktion aus demselben Grund nichts Sinnvolles zur¨uck.
• Die Update-Log-Datei wird vom Handler-Thread aktualisiert, wenn die Zeile in die
Tabelle eingef¨ugt wird. Im Falle des Einf¨ugens mehrerer Zeilen wird die Update-Log-
Datei aktualisiert, wenn die erste Zeile eingef¨ugt wird.
• Nachdem alle delayed_insert_limit Zeilen geschrieben wurden, pr¨uft der Handler,
ob noch irgend welche SELECT-Statements anh¨angig sind oder nicht. Falls ja, gestattet
er diesen, ausgef¨uhrt zu werden, bevor weiter gemacht wird.
• Wenn der Handler keine Zeilen mehr in seiner Warteschlange hat, wird die Tabel-
lensperre aufgehoben. Wenn innerhalb von delayed_insert_timeout Sekunden keine
neuen INSERT DELAYED-Befehle mehr empfangen werden, beendet sich der Handler.
Comentarios a estos manuales