Wenn Sie einen mysqladmin status-Befehl ausführen, sollten Sie etwa folgendes Ergebnis erhalten:
Uptime: 426 Running threads: 1 Questions: 11082 Reloads: 1 Open tables: 12
Der Open tables
-Wert von 12 kann etwas
verwirrend sein, wenn Sie nur sechs Tabellen haben.
MySQL arbeitet mit mehreren Threads, d. h., mehrere Clients
setzen unter Umständen gleichzeitig Abfragen für eine gegebene
Tabelle ab. Um das Problem mit mehreren Client-Threads, die
unterschiedliche Zustände bezüglich derselben Tabelle haben,
zu minimieren, wird die Tabelle von allen nebenläufigen Threads
unabhängig geöffnet. Zwar wird hierdurch mehr Speicher
verbraucht, aber in der Regel wird die Leistung verbessert. Bei
MyISAM
-Tabellen ist pro Client, der eine
Tabelle geöffnet hält, ein zusätzlicher Dateideskriptor für
die Datendatei erforderlich. (Dies steht im Gegensatz zum
Indexdateideskriptor, der von allen Threads gemeinsam verwendet
wird.)
Die Systemvariablen table_open_cache
,
max_connections
und
max_tmp_tables
bestimmen die maximale Anzahl
der Dateien, die der Server geöffnet hält. Wenn Sie einen oder
mehrere dieser Werte erhöhen, stoßen Sie unter Umständen auf
ein Limit, das Ihr Betriebssystem bezüglich der
prozessbezogenen Anzahl offener Dateideskriptoren setzt. Viele
Betriebssysteme erlauben Ihnen eine Anhebung der Beschränkung
für offene Dateien, auch wenn sich die jeweilige Methode von
Betriebssystem zu Betriebssystem unterscheidet. Informationen
dazu, ob und wie es möglich ist, diesen Wert anzuheben,
entnehmen Sie der Dokumentation zu Ihrem Betriebssystem.
table_open_cache
bezieht sich auf
max_connections
. So sollten Sie etwa für 200
gleichzeitig laufende Verbindungen einen Tabellen-Cache mit
einer Größe von mindestens 200 ×
haben, wobei
N
N
die maximale Anzahl von Tabellen
pro Join in einer beliebigen von Ihnen ausgeführten Abfrage
ist. Sie müssen ferner einige zusätzliche Dateideskriptoren
für Temporärtabellen und -dateien reservieren.
Stellen Sie sicher, dass Ihr Betriebssystem die Anzahl der mit
der Einstellung von table_open_cache
verbundenen Deskriptoren für offene Dateien verarbeiten kann.
Wenn für table_open_cache
ein zu hoher Wert
eingestellt ist, stehen für MySQL irgendwann unter Umständen
keine Dateideskriptoren mehr zur Verfügung: MySQL verweigert
dann Verbindungen, kann Abfragen nicht ausführen und wird im
Ganzen sehr instabil. Sie müssen ferner berücksichtigen, dass
die MyISAM
-Speicher-Engine zwei
Dateideskriptoren für jede offene Tabelle benötigt. Sie
können die Anzahl der MySQL zur Verfügung stehenden
Dateideskriptoren mit der Startoption
--open-files-limit
für
mysqld_safe erhöhen. Siehe auch
Abschnitt A.2.17, „Datei nicht gefunden“.
Der Cache für die offenen Tabellen wird auf einem Niveau von
table_open_cache
Einträgen gehalten. Der
Standardwert beträgt 64, kann aber mit der Option
--table_open_cache
für
mysqld geändert werden. Beachten Sie, dass
MySQL zur Ausführung von Abfragen vorübergehend auch mehr
Tabellen öffnen kann.
MySQL schließt nicht verwendete Tabellen und entfernt sie aus dem Tabellen-Cache, wenn
der Cache voll ist und ein Thread eine Tabelle zu öffnen versucht, die nicht im Cache enthalten ist,
der Cache mehr als table_open_cache
Einträge enthält und eine Tabelle im Cache von keinem
Thread mehr verwendet wird,
die Tabelle synchronisiert wird. Dies passiert, wenn jemand
eine FLUSH TABLES
-Anweisung absetzt oder
einen der Befehle mysqladmin flush-tables
oder mysqladmin refresh ausführt.
Wenn der Tabellen-Cache Einträge enthält, ermittelt der Server einen zu verwendenden Cache-Eintrag wie folgt:
Tabellen, die zurzeit nicht verwendet werden, werden freigegeben. Hierbei wird mit der Tabelle begonnen, die am längsten nicht verwendet wurde.
Wenn eine neue Tabelle geöffnet werden muss, der Cache aber voll ist und keine Tabelle freigegeben werden kann, dann wird der Cache vorübergehend nach Bedarf erweitert.
Ist der Cache vorübergehend erweitert und eine Tabelle erhält den Status „nicht verwendet“, dann wird diese Tabelle geschlossen und aus dem Cache entfernt.
Eine Tabelle wird für jeden nebenläufigen Zugriff geöffnet.
Das bedeutet, dass die Tabelle zweimal geöffnet werden muss,
wenn zwei Threads auf dieselbe Tabelle zugreifen oder ein Thread
die Tabelle zweimal in derselben Abfrage referenziert
(beispielsweise beim Join einer Tabelle mit sich selbst). Jeder
gleichzeitige Öffnungsvorgang erfordert einen Eintrag im
Tabellen-Cache. Der erste Öffnungsvorgang einer
MyISAM
-Tabelle nimmt zwei Dateideskriptoren
entgegen, nämlich je einen für die Daten- und die Indexdatei.
Jede zusätzliche Verwendung der Tabelle benötigt nur einen
Deskriptor für die Datendatei. Der Deskriptor für die
Indexdateien wird von allen Threads gemeinsam verwendet.
Wenn Sie eine Tabelle mit der Anweisung HANDLER
öffnen, wird
für den Thread ein dediziertes Tabellenobjekt reserviert.
Dieses Tabellenobjekt wird nicht mit anderen Threads gemeinsam
genutzt und wird erst geschlossen, wenn der Thread
tbl_name
OPENHANDLER
aufruft oder beendet wird. In diesem Fall wird
die Tabelle in den Tabellen-Cache zurückgeführt (sofern dieser
nicht voll ist). Siehe auch Abschnitt 13.2.3, „tbl_name
CLOSEHANDLER
“.
Sie können ermitteln, ob Ihr Tabellen-Cache zu klein ist, indem
Sie die Statusvariable Opened_tables
für
mysqld überprüfen:
mysql> SHOW STATUS LIKE 'Opened_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 2741 |
+---------------+-------+
Wenn der Wert sehr groß ist (und zwar auch dann, wenn Sie nicht
viele FLUSH TABLES
-Anweisungen abgesetzt
haben), dann sollten Sie die Größe des Tabellen-Caches
erhöhen. Siehe auch Abschnitt 5.2.2, „Server-Systemvariablen“,
und Abschnitt 5.2.4, „Server-Statusvariablen“.
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.