[+/-]
Um die Festplattenzugriffe zu minimieren, verwendet die
MyISAM
-Speicher-Engine eine Strategie, auf
der zahlreiche Datenbanksysteme basieren. Sie benutzt einen
Cache-Mechanismus, um die am häufigsten abgerufenen
Tabellenblöcke im Speicher zu halten:
Für Indexblöcke wird eine spezielle Struktur namens Schlüssel-Cache (oder Schlüsselpuffer) implementiert. Diese Struktur enthält eine Anzahl von Blockpuffern, in denen die meistverwendeten Indexblöcke abgelegt werden.
Für Datenblöcke verwendet MySQL keinen speziellen Cache. Stattdessen wird der Dateisystem-Cache des nativen Betriebssystems benutzt.
Dieser Abschnitt beschreibt zunächst den grundlegenden Betrieb
des MyISAM
-Schlüssel-Caches. Nachfolgend
werden Funktionen erläutert, die die Leistungsfähigkeit des
Schlüssel-Caches optimieren und mit denen Sie den Cache-Betrieb
besser steuern können:
Mehrere Threads können gleichzeitig auf den Cache zugreifen.
Sie können mehrere Schlüssel-Caches einrichten und Tabellenindizes speziellen Caches zuweisen.
Die Größe des Schlüssel-Caches stellen Sie mit der
Systemvariablen key_buffer_size
ein. Wenn
diese Variable auf null gesetzt ist, wird kein Cache verwendet.
Der Schlüssel-Cache wird ferner nicht benutzt, wenn der Wert
key_buffer_size
zu klein ist, um die
Mindestanzahl von Blockpuffern (8) zu reservieren.
Wenn der Schlüssel-Cache nicht betriebsbereit ist, erfolgt der Zugriff auf Indexdateien nur über die Puffer des nativen Dateisystems, die vom Betriebssystem bereitgestellt werden. (Anders gesagt, wird auf Tabellenindexblöcke unter Verwendung derselben Methode zugegriffen wie auf Tabellendatenblöcke.)
Ein Indexblock ist eine zusammenhängende Zugriffseinheit für
MyISAM
-Indexdateien. Normalerweise entspricht
die Größe eines Indexblocks der Größe der Knoten des
B-Trees. (Indizes werden auf der Festplatte mit einer
B-Tree-Datenstruktur dargestellt. Knoten am unteren Ende des
Trees sind Blattknoten, Knoten oberhalb der Blätter
Nichtblattknoten.)
Alle Blockpuffer in einer Schlüssel-Cache-Struktur haben dieselbe Größe. Diese Größe kann der Größe eines Tabellenindexblocks entsprechen, sie kann aber auch höher oder niedriger sein. Normalerweise ist einer dieser beiden Werte ein Vielfaches des anderen.
Wenn ein Zugriff auf Daten aus einem Tabellenindexblock erfolgen muss, dann überprüft der Server zunächst, ob er in einem Blockpuffer des Schlüssel-Caches vorhanden ist. Ist dies der Fall, dann greift der Server auf die Daten im Schlüssel-Cache statt auf der Festplatte zu: Er liest aus und/oder schreibt in den Cache statt auf die Festplatte. Andernfalls wählt der Server einen Cache-Blockpuffer, der einen oder mehrere andere Tabellenindexblöcke enthält, und ersetzt die dortigen Daten durch eine Kopie des erforderlichen Tabellenindexblocks. Sobald der neue Indexblock sich im Cache befindet, kann auf die Indexdaten zugegriffen werden.
Wenn ein für die Ersetzung gewählter Block modifiziert wurde, wird dieser als „schmutzig“ bezeichnet. In diesem Fall wird der Inhalt vor der Ersetzung in den Tabellenindex geschrieben, von dem er kam.
Normalerweise verwendet der Server eine LRU-Strategie (Least Recently Used): Wenn ein Block zur Ersetzung gewählt werden muss, entscheidet er sich für den Indexblock, der am längsten nicht mehr verwendet wurde. Um die Auswahl zu erleichtern, unterhält das Schlüssel-Cache-Modul eine spezielle Warteschlange (die LRU-Kette) mit allen verwendeten Blöcken. Wenn auf einen Block zugegriffen wird, wird er ans Ende der Warteschlange gesetzt. Müssen Blöcke ersetzt werden, dann sind die Blöcke am Anfang der Warteschlange die am längsten nicht verwendeten und werden infolgedessen als Erste geräumt.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.