Table_cache in mySQL optimieren (und verstehen)

18

Ich habe das ausgezeichnete MySQL-Leistungsoptimierungsskript ausgeführt und begonnen, die Vorschläge durchzuarbeiten. Einer, dem ich begegnet bin, war

TABLE CACHE
Aktueller table_cache-Wert = 4096 Tabellen Sie haben insgesamt 1073 Tabellen. Sie haben 3900 offene Tische. Die aktuelle Trefferquote von table_cache beträgt 2%, während 95% Ihres Tabellencaches belegt sind. Sie sollten wahrscheinlich Ihren table_cache erhöhen

Ich fing an, im table_cache nachzulesen, fand aber, dass die MySQL-Dokumentation ziemlich mangelhaft ist. Sie sagen, um die table_cache"wenn Sie das Gedächtnis haben" zu erhöhen . Leider ist die table_cacheVariable als "Die Anzahl offener Tabellen für alle Threads" definiert.

Wie ändert sich der von MySQL verwendete Speicher, wenn ich diese Variable erhöhe? Was ist ein guter Wert, um es zu setzen?

Jotango
quelle

Antworten:

16

Aus der MySQL-Dokumentation

Beispielsweise sollten Sie für 200 gleichzeitig ausgeführte Verbindungen eine Tabellencachegröße von mindestens 200 × N haben, wobei N die maximale Anzahl von Tabellen pro Join in allen von Ihnen ausgeführten Abfragen ist. Sie müssen auch einige zusätzliche Dateideskriptoren für temporäre Tabellen und Dateien reservieren.

Wenn Sie also in Ihrer Anwendung eine Abfrage haben, die 4 Tabellen verknüpft, und 200 gleichzeitige Verbindungen verarbeiten möchten, sollten Sie basierend auf dieser Anweisung einen table_cache von mindestens 800 haben.

Was die Speichernutzung angeht, habe ich diese Zahlen nicht. Ich würde vermuten, dass dies von der Größe Ihrer Tabellen abhängt, die zwischengespeichert werden.

ManiacZX
quelle
Danke für den Hinweis. Ich habe ein bisschen Angst davor, meine table_cache-Nummer zu erhöhen, ohne zu wissen, wie sich die RAM-Auslastung ändern wird. Der RAM des Computers ist bereits voll.
Jotango
Sind Sie sicher, dass der Speicher tatsächlich belegt ist oder nur der Speicher von Puffern / Cache belegt wurde? Führen Sie "free -m" aus und sehen Sie sich die zweite Zeile (- / + Puffer / Cache) an. Dies ist eine genauere Darstellung Ihrer Speichernutzung in mb. Die Antworten finden Sie unter serverfault.com/questions/73189/… und serverfault.com/questions/9442/…
ManiacZX,
Ja, es nutzt wirklich den Speicher. Gestern hat es getauscht, was für eine Produktions-DB wirklich schlecht ist. Ich habe heute bei HP ein RAM-Upgrade bestellt.
Jotango
Für diejenigen, die jetzt dazu kommen, ist diese Antwort für mysql 5.1+ nicht korrekt. es bezieht sich jetzt auf, table_open_cachewenn Sie die Dokumente betrachten. Siehe @MarkRs Antwort beim Betrachtentable_cache
Jason
3

Sie sollten die Variable Opened_Tables überwachen und sehen, wie schnell sie zunimmt. Wenn dies erheblich schneller ist als das Erstellen neuer Tabellen (einschließlich temporärer Tabellen), ist der Tabellencache möglicherweise zu klein.

Table_Cache sollte immer - meistens auch - deutlich größer sein als die Gesamtzahl der Tabellen auf dem Server. Andernfalls werden weiterhin Tabellen geöffnet und geschlossen.

Ich kann nicht sehen, wie Sie eine Cachetrefferquote von 2% erzielen können, es sei denn, Sie haben die Zeit unmittelbar nach einem Serverneustart gemessen oder häufig FLUSH TABLES verwendet (im Verhältnis zur Anzahl der Abfragen). Normalerweise sollte die Trefferrate im Tabellencache 99,9% betragen, da sonst die Leistung beeinträchtigt wird.

Mache keine FLUSH TABLES, wenn du es vermeiden kannst, es bläst den Cache weg.

Das Öffnen von Tabellen ist teuer, da die FRM-Datei gelesen werden muss. In MyISAM ist es bedeutend schlechter (als in anderen Engines), da beim Schließen einer Tabelle auch alle Blöcke im Schlüssel-Cache verworfen werden, die aus den Indizes stammen. Wenn Sie eine Tabelle schließen, werden ihre Indizes aus dem Schlüssel-Cache abgelegt == nicht gut! Andere Engines behalten die zwischengespeicherten Blöcke bei, müssen jedoch Metadaten erneut lesen und einige Strukturen zuweisen.

MarkR
quelle