Kapitel 6: MySQL-Optimierung 345
und hierdurch weniger Festplattenzugriffe erforderlich sind. Ausserdem wird Code
eingespart, weil Sie Ihre Textdateien nicht parsen m¨ussen, um Zeilen- und Spaltenbe-
grenzungen zu finden.
• Ausserdem k¨onnen Sie Replikation benutzen, um die Geschwindigkeit zu steigern. Siehe
Abschnitt 5.10 [Replication], Seite 306.
• Wenn eine Tabelle mit DELAY_KEY_WRITE=1 deklariert wird, werden Aktualisierungen
auf Indexe schneller, weil diese nicht auf Platte geschrieben werden, bis die Datei
geschlossen wird. Der Nachteil ist, dass Sie auf diesen Tabellen myisamchk laufen lassen
sollten, bevor Sie mysqld starten, um sicherzustellen, dass diese in Ordnung sind, falls
irgend etwas mysqld mittendrin killt. Weil die Schl¨ussel-Informationen jederzeit aus
den Daten erzeugt werden k¨onnen, sollten Sie durch DELAY_KEY_WRITE nichts verlieren.
6.3 Sperren (Locking)
6.3.1 Wie MySQL Tabellen sperrt
Im Anhang finden Sie eine Er¨orterung zu den unterschiedlichen Sperrmethoden. Siehe
Abschnitt D.4 [Locking methods], Seite 702.
Jedes Sperren in MySQL ist blockierungsfrei. Das wird erreicht, indem alle Sperren zugleich
am Anfang einer Anfrage angefordert werden, und indem Tabellen immer in derselben
Reihenfolge gesperrt werden.
The Sperrmethode, die MySQL f¨ur WRITE-Sperren benutzt, funktioniert wie folgt:
• Falls es keine Sperren auf die Tabelle gibt, wird eine Schreibsperre gemacht.
• Ansonsten wird die Sperranforderung in die Schreibsperren-Warteschlange eingereiht.
Die Sperrmethode, die MySQL f¨ur READSperren benutzt, funktioniert wie folgt:
• Falls es keine Schreibsperren auf die Tabelle gibt, wird eine Lesesperre gemacht.
• Ansonsten wird die Sperranforderung in die Lesesperren-Warteschlange eingereiht.
Wenn eine Sperre aufgehoben wird, wird die Sperren den Threads in der Schreibsperren-
Warteschlange verf¨ugbar gemacht, danach den Threads in der Lesesperren-Warteschlange.
Das bedeutet, wenn Sie viele Aktualisierungen auf eine Tabelle haben, warten SELECT-
Statements, bis es keine Aktualisierungen mehr gibt.
Um das f¨ur den Fall zu umgehen, dass es viele INSERT- und-SELECT-Operationen auf eine
Tabelle gibt, k¨onnen Sie Zeilen in eine tempor¨are Tabelle einf¨ugen und die echte Tabelle
gelegentlich aus den Daten der tempor¨are Tabelle aktualisieren.
Das machen Sie wie folgt:
mysql> LOCK TABLES echte_tabelle WRITE, einfuege_tabelle WRITE;
mysql> insert into echte_tabelle select * von einfuege_tabelle;
mysql> TRUNCATE TABLE einfuege_tabelle;
mysql> UNLOCK TABLES;
Sie k¨onnen bei INSERT, UPDATE oder DELETE die LOW_PRIORITY-Option oder bei SELECT
die HIGH_PRIORITY-Option benutzen, wenn Sie dem Abruf von Daten in bestimmten F¨allen
Kommentare zu diesen Handbüchern