
346 MySQL - Technische Referenz f¨ur Version 5.0.1-alpha
Priorit¨at einr¨aumen wollen. Sie k¨onnen auch mysqld mit --low-priority-updates starten,
um dasselbe Verhalten zu erreichen.
Die Benutzung von SQL_BUFFER_RESULT kann ebenfalls helfen, Tabellensperren k¨urzer zu
machen. Siehe Abschnitt 7.4.1 [SELECT], Seite 435.
Sie k¨onnen auch den Sperr-Code in ‘mysys/thr_lock.c’ ¨andern, um eine einzige
Warteschlagen zu benutzen. In diesem Fall haben Schreibsperren und Lesesperren dieselbe
Priorit¨at, was bei einigen Applikationen eventuell hilfreich ist.
6.3.2 Themen, die Tabellensperren betreffen
Der Tabellensperren-Code in MySQL ist blockierungsfrei.
MySQL benutzt Tabellensperren (anstelle von Zeilensperren oder Spaltensperren) f¨ur alle
Tabellentypen ausser BDB-Tabellen, um eine sehr hohe Sperrgeschwindigkeit zu erzielen.
Bei großen Tabellen ist Tabellensperren bei den meisten Applikationen VIEL besser als
Zeilensperren, aber es gibt nat¨urlich ein paar Fallstricke.
Bei BDB- und InnoDB-Tabellen benutzt MySQL Tabellensperren, wenn Sie die Tabelle ex-
plizit mit LOCK TABLES sperren oder einen Befehl ausf¨uhren, der jede Zeile in der Tabelle
¨andern wird, wie ALTER TABLE. Bei diesen Tabellentypen empfehlen wir, LOCK TABLES
¨uberhaupt nicht zu benutzen.
Ab MySQL-Version 3.23.7 k¨onnen Sie Zeilen in MyISAM-Tabellen zur gleichen Zeit einf¨ugen,
w¨ahrend andere Threads aus der Tabelle lesen. Beachten Sie, dass das momentan nur
funktioniert, wenn es zu der Zeit, zu der das Einf¨ugen vorgenommen wird, keine durch
gel¨oschte Zeilen verursachte L¨ocher in der Tabelle gibt. Wenn alle L¨ocher mit neuen Daten
gef¨ullt wurden, werden gleichzeitige Einf¨ugevorg¨ange automatisch wieder aktiviert.
Tabellensperren erm¨oglicht, dass viele Threads gleichzeitig aus einer Tabelle lesen, aber
bevor ein Thread in die Tabelle schreiben kann, muss er zun¨achst exklusiven Zugriff erhalten.
W¨ahrend der Aktualisierung m¨ussen andere Threads, die auf diese Tabelle zugreifen wollen,
warten, bis die Aktualisierung fertig ist.
Weil Aktualisierung von Tabellen normalerweise als wichtiger erachtet werden als SELECT,
erhalten alle Statements, die eine Tabelle aktualisieren, eine h¨ohere Priorit¨at als Statements,
die Informationen aus der Tabelle abrufen. Das sollte sicherstellen, dass Aktualisierungen
nicht ’verhungern’, wenn viele große Anfragen auf eine bestimmte Tabelle durchgef¨uhrt
werden. (Sie k¨onnen das ¨andern, indem Sie bei dem Statement, dass die Aktualisierung
durchf¨uhrt, LOW PRIORITY verwenden, oder beim SELECT-Statement HIGH_PRIORITY.)
Ab MySQL-Version 3.23.7 k¨onnen Sie die max_write_lock_count-Variable benutzen,
um MySQL zu zwingen, tempor¨ar allen SELECT-Statements, die auf eine Tabelle warten,
nach einer bestimmten Anzahl von Einf¨ugevorg¨angen auf eine Tabelle h¨ohere Priorit¨at
einzur¨aumen.
Tabellensperren ist jedoch bei folgendem Szenario nicht sehr gut:
• Ein Client f¨uhrt ein SELECT aus, das lange Zeit l¨auft.
• Ein anderer Client f¨uhrt danach ein UPDATE auf die benutzte Tab elle aus. Dieser Client
wartet, bis das SELECT fertig ist.
• Ein weiterer Client f¨uhrt ein weiteres SELECT-Statement auf dieselbe Tabelle aus. Weil
UPDATE h¨ohere Priorit¨at als SELECT hat, wartet dieses SELECT, bis das UPDATE fertig
ist. Es wartet auch darauf, dass das erste SELECT fertig ist!
Comentarios a estos manuales