MySQL-Systemvariablen – table_cache

Mitten im August, als die Sonne noch bis tief in den Abend schien, habe ich mit meinem ersten Beitrag MySQL-Systemvariablen – key_buffer_size Euch, liebe PHP-Performance-Besucher, dafür sensibilisiert, die MySQL-Systemvariablen sorgfältig zu überprüfen. Guter Code schön und gut, es sollten jedoch im Vorfeld die Rahmenbedingungen abgecheckt werden.

Gemäß meinem damaligen Versprechen möchte ich die Reihe MySQL-Systemvariablen hier nun fortführen und mich anstelle der Systemvariable key_buffer_size nunmehr table_cache bzw. table_open_cache – so heißt die Variable seit MySQL 5.1.3 – widmen.
In dieser Variable werden die offenen Tabellen für alle Threads zwischengespeichert, weswegen es auch durchaus möglich ist, dass ein und dieselbe Tabelle mehrfach im Cache vorliegt.

Das Pendant zu table_cache bzw. die Statusvariable ist Opened_tables. In dieser ist in Form einer Ganzzahl die Anzahl aller je in den Cache geschriebenen Tabellen hinterlegt.
Sehr aussagekräftig ist der Wert dieser Variable allerdings nicht, denn zum einen steht er in Abhängigkeit zur Laufzeit und zum anderen kann er über einfache MySQL-Kommandos wie FLUSH TABLES oder OPTIMIZE TABLES schnell verfälscht werden. Diese veranlassen nämlich nichts anderes, als dass alle Tabellen geschlossen werden und nur noch die neu gestartet werden, die benötigt werden.

Deswegen hat MySQL noch eine zweite Statusvariable für table_cache bereitgestellt, und zwar Open_tables, die als Rückgabe wirklich nur die Zahl an Tabellen zurückliefert, die momentan im Cache liegen.
Um stets die optimale Performance zu gewährleisten, gilt daher:
table_cache >= Open_tables.

Habt Ihr eine feste Datenbankstruktur, die nur sporadisch um weitere Tabellen ergänzt wird, werdet Ihr schnell über die Variable Open_tables feststellen können, wie hoch der Wert für table_cache angesetzt sein muss. Werden allerdings nicht regelmäßig die Tabellen geschlossen und neu geöffnet – dies muss manuell über eben genannte Befehle geschehen –, so sammelt sich poe a poe die Anzahl der im Cache enthaltenen Tabellen, bis schließlich der Wert der table_cache-Variable ein weiteres Wachsen verhindert.

Abschließend dieses Beitrags zur MySQL-Systemvariable table_cache noch eine kleine, persönliche Erfahrung mit table_cache, die das Ganze noch an dieser Stelle etwas praxisnäher machen sollte.
Auf meinem Server hatte ich bis vor kurzem die table_cache-Variable auf den Wert 256 festgesetzt. Erschrocken hatte ich mich dann, als auch die Statusvariable Open_tables mir diesen Wert zurückgab, schließlich bedeutete dies, dass keine neuen Tabellen in den Cache geschrieben werden können und damit die Performance nicht mehr optimal sein kann. Ein FLUSH TABLES half dann meistens kurzfristig aus. Der Wert reduzierte sich auf 240-245. Guckte man jedoch einen Tag später wieder rein, war bereits wieder das Potential ausgeschöpft und der Wert der Statusvariable betrug 256.

Daraufhin habe ich die Variable gleich einmal verdoppelt auf 512. Seither habe ich immer in etwa einen Wert von 320 für die Open_tables-Variable. Führe ich FLUSH TABLES aus, reduziert sich der Wert auf etwa 290.

Ich hoffe, mit diesem Beitrag Euch dazu bewegt haben zu können, einmal die Variable table_cache näher zu untersuchen, ob sie nicht ggf. bereits am Limit läuft und somit Performance verschenkt wird. 😉

Florian hat 2 Beiträge geschrieben

Eine Antwort schreiben

Ihre E-Mail-Adresse wird nicht veröffentlicht. Benötigte Felder sind markiert mit *

You may use these HTML tags and attributes: <a href=""> <blockquote cite=""> <pre lang=""> <b> <strong> <i> <em>