Der gemeinsame Zugriff auf den Schlüssel-Cache verbessert die Leistung, beseitigt das Problem des gleichzeitigen Zugriffs durch mehrere Threads aber nicht vollständig. Diese wetteifern weiterhin um Steuerstrukturen, mit denen der Zugriff auf die Schlüssel-Cache-Puffer verwaltet wird. Um also die Rivalität um den Schlüssel-Cache-Zugriff weiter zu verringern, stellt MySQL zusätzlich mehrere Schlüssel-Caches bereit. Diese Funktion erlaubt es Ihnen, verschiedenen Schlüssel-Caches unterschiedliche Tabellenindizes zuzuweisen.
Wenn mehrere Schlüssel-Caches vorhanden sind, muss der Server
wissen, welchen Cache er bei der Verarbeitung von Abfragen
für eine gegebene MyISAM
-Tabelle verwenden
soll. Standardmäßig werden alle
MyISAM
-Tabellenindizes im vorgabeseitigen
Schlüssel-Cache zwischengespeichert. Um Tabellenindizes einem
bestimmten Schlüssel-Cache zuzuweisen, verwenden Sie die
Anweisung CACHE INDEX
(siehe
Abschnitt 13.5.5.1, „CACHE INDEX
“). Die folgende Anweisung
beispielsweise weist Indizes der Tabellen
t1
, t2
und
t3
dem Schlüssel-Cache namens
hot_cache
zu:
mysql> CACHE INDEX t1, t2, t3 IN hot_cache;
+---------+--------------------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+--------------------+----------+----------+
| test.t1 | assign_to_keycache | status | OK |
| test.t2 | assign_to_keycache | status | OK |
| test.t3 | assign_to_keycache | status | OK |
+---------+--------------------+----------+----------+
Der in der CACHE INDEX
-Anweisung
referenzierte Schlüssel-Cache kann erstellt werden, indem
seine Größe mit einer SET
GLOBAL
-Anweisung zur Parametereinstellung oder in
den Startoptionen des Servers angegeben wird. Zum Beispiel:
mysql> SET GLOBAL keycache1.key_buffer_size=128*1024;
Um einen Schlüssel-Cache zu beseitigen, setzen Sie seine Größe auf null:
mysql> SET GLOBAL keycache1.key_buffer_size=0;
Beachten Sie, dass Sie den vorgabeseitigen Schlüssel-Cache nicht zerstören können. Alle diesbezüglichen Versuche werden ignoriert:
mysql>SET GLOBAL key_buffer_size = 0;
mysql>show variables like 'key_buffer_size';
+-----------------+---------+ | Variable_name | Value | +-----------------+---------+ | key_buffer_size | 8384512 | +-----------------+---------+
Schlüssel-Cache-Variablen sind strukturierte Systemvariablen,
die einen Namen und Komponenten aufweisen. Bei
keycache1.key_buffer_size
etwa ist
keycache1
der Cache-Variablenname und
key_buffer_size
die Cache-Komponente. Eine
Beschreibung der Syntax zur Referenzierung strukturierter
Systemvariablen für den Schlüssel-Cache finden Sie in
Abschnitt 5.2.3.1, „Strukturierte Systemvariablen“.
Standardmäßig werden Tabellenindizes dem vorgabeseitigen Schlüssel-Cache (Haupt-Schlüssel-Cache) zugewiesen, der beim Serverstart erstellt wird. Wird ein Schlüssel-Cache zerstört, dann werden alle ihm zugewiesenen Indizes wieder dem Standard-Schlüssel-Cache zugewiesen.
Für einen gut ausgelasteten Server empfehlen wir eine Strategie mit drei Schlüssel-Caches:
Ein „heißer“ Schlüssel-Cache, der 20 Prozent des für alle Schlüssel-Caches reservierten Speichers verwendet. Diesen setzen Sie für Tabellen ein, in denen sehr viele Suchvorgänge, aber keine Änderungen erfolgen.
Ein „kalter“ Schlüssel-Cache, der weitere 20 Prozent des für alle Schlüssel-Caches reservierten Speichers verwendet. Dieser Cache unterstützt mittelgroße, häufig geänderte Tabellen (z. B. Temporärtabellen).
Ein „warmer“ Schlüssel-Cache, der die verbleibenden 60 Prozent des Schlüssel-Cache-Speichers belegt. Diesen verwenden Sie als vorgabeseitigen Schlüssel-Cache, der standardmäßig von allen anderen Tabellen benutzt wird.
Ein Grund dafür, warum die Verwendung dreier Schlüssel-Caches von Vorteil ist, besteht darin, dass der Zugriff auf eine Schlüssel-Cache-Struktur den Zugriff auf die anderen nicht behindert. Anweisungen, die auf Tabellen zugreifen, die dem einen Cache zugewiesen sind, konkurrieren nicht mit Anweisungen, deren referenzierte Tabellen auf einen anderen Cache zugreifen. Ein Leistungsgewinn wird aber auch aus anderen Gründen erzielt:
Der heiße Cache wird nur für anfordernde Abfragen verwendet, d. h., sein Inhalt ändert sich nicht. Dies bedeutet, dass, wann immer ein Indexblock von der Festplatte abgerufen werden muss, der Inhalt des für die Ersetzung gewählten Cache-Blocks nicht zuerst synchronisiert werden muss.
Ist ein Index dem heißen Cache zugewiesen, dann ist, wenn keine Abfragen kommen, die einen Indexscan erfordern, die Wahrscheinlichkeit hoch, dass die Indexblöcke, die den Nichtblattknoten des B-Trees entsprechen, im Cache verbleiben.
Ein Updatevorgang, wie er am häufigsten für Temporärtabellen vorgenommen wird, wird wesentlich schneller durchgeführt, wenn der geänderte Knoten sich im Cache befindet und nicht erst von der Festplatte gelesen werden muss. Wenn die Größe der Indizes der Temporärtabellen mit der Größe des kalten Schlüssel-Caches vergleichbar ist, dann ist die Wahrscheinlichkeit, dass der aktualisierte Knoten sich im Cache befindet, extrem hoch.
CACHE INDEX
richtet eine Verknüpfung
zwischen einer Tabelle und einem Schlüssel-Cache ein, die
jedoch nur bis zum nächsten Serverneustart bestehen bleibt.
Wenn diese Verknüpfung jedes Mal, wenn der Server neu
startet, erstellt werden soll, können Sie dies etwa mit einer
Optionsdatei erreichen: Setzen Sie Variableneinstellungen, mit
denen Ihre Schlüssel-Caches konfiguriert werden, und eine
Option namens init-file
in die
Optionsdatei, die eine Datei bezeichnet, welche die
auszuführenden CACHE INDEX
-Anweisungen
enthält. Zum Beispiel:
key_buffer_size = 4G hot_cache.key_buffer_size = 2G cold_cache.key_buffer_size = 2G init_file=/path/to/data-directory/mysqld_init.sql
Die Anweisungen in mysqld_init.sql
werden
bei jedem Start des Servers ausgeführt. Die Datei sollte eine
SQL-Anweisung pro Zeile enthalten. Das folgende Beispiel weist
verschiedene Tabellen jeweils hot_cache
und
cold_cache
zu:
CACHE INDEX db1.t1, db1.t2, db2.t3 IN hot_cache CACHE INDEX db1.t4, db2.t5, db2.t6 IN cold_cache
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.