Warum erstellt MySQL so viele temporäre Tabellen auf der Festplatte?

13

Kann ein Konfigurationsfehler dazu führen, dass von mysql..mysql tuner shows zu viele temporäre Tabellen erstellt werden?

Current max_heap_table_size = 200 M
Current tmp_table_size = 200 M
Of 17158 temp tables, 30% were created on disk

table_open_cache = 125 tables
table_definition_cache = 256 tables
You have a total of 97 tables
You have 125 open tables.
Current table_cache hit rate is 3%

Früher war die temporäre Tabelle "von den 23725 temporären Tabellen wurden 38% auf der Festplatte erstellt", aber ich habe max_heap und tmp_table von 16m auf 200m geändert und sie auf 30% gesenkt.

Aufbau:

engine myisam 
group_concat_max_len = 32768
key_buffer_size = 3.7 GB,
thread_stack = 256k,
table_cache = 125
query_cache_limit = 1M
query_cache_size = 16M
join_buffer_size = 2.00 M
max_connections = 800

Ein anderes System mit Standardkonfiguration zeigt "23725 temporäre Tabellen, 1% wurden auf der Festplatte erstellt" mit derselben Datenbank.

Ich habe mit diesem Problem versucht, die Standardeinstellung auf dem Computer zu ändern, und es wird weiterhin "Von 580 temporären Tabellen wurden 16% auf der Festplatte erstellt" angezeigt.

Ich benutze Ubuntu 11.4 64 Bit mit 48 GB RAM. Kann jemand eine Lösung vorschlagen?

Wird die Änderung der Datenbank-Engine von "myisam" in "memory" für Tabellen mit "group by" dieses Problem beheben? Wie hier erklärt: http://www.mysqlperformanceblog.com/2007/08/16/how-much-overhead-is-caused-by-on-disk-temporary-tables/

ananthan.nair
quelle

Antworten:

16

mysqltuner liefert selten nützliche Informationen. Es verwendet zumeist irrelevante Statistiken über "Trefferraten" und setzt willkürliche Grenzen für eine akzeptable Anzahl von akzeptablen Widgets. Wenn Sie nicht mit einem Leistungsproblem konfrontiert sind, müssen Sie keines der Probleme lösen, die es für Sie darstellt. Vor diesem Hintergrund finden Sie hier ein paar Hintergrundinformationen zu temporären Tabellen ...

MySQL verwendet intern die MEMORY-Speicher-Engine zum Erstellen impliziter temporärer Tabellen. Auf der Festplatte temporäre Tabellen verwenden die MyISAM-Speicher-Engine.

Temporäre Tabellen werden auf der Festplatte erstellt, wenn:

  • TEXT- oder BLOB-Felder sind vorhanden (da MEMORY diese Typen nicht unterstützt)
  • Die Größe der resultierenden impliziten temporären Tabelle überschreitet den Wert von tmp_table_sizeodermax_heap_table_size
  • Wenn eine Spalte mit mehr als 512 Bytes entweder mit GROUP BY oder UNION oder ORDER BY verwendet wird

Weitere Informationen finden Sie in der MySQL-Dokumentation zu internen temporären Tabellen.

Was können Sie dagegen tun? Vorausgesetzt, dass es sich tatsächlich um ein Leistungsproblem handelt (anstatt Sie nur auf intelligente Weise zu stören):

  • Vermeiden Sie TEXT / BLOB-Felder und verwenden Sie stattdessen nach Möglichkeit entsprechend große VARCHAR- oder CHAR-Felder.
  • Wenn TEXT / BLOB unvermeidbar sind, ordnen Sie sie zu, um Tabellen mit einer Fremdschlüsselbeziehung zu trennen, und fügen Sie sie nur dann hinzu, wenn Sie sie benötigen.
  • Behandeln Sie große Spalten mit mehr als 512 Byte wie die oben genannten TEXT / BLOB-Felder.
  • Stellen Sie sicher, dass Ihre Abfragen nur die von Ihnen benötigte Ergebnismenge zurückgeben (entsprechend ausgewählte WHERE-Klauseln, vermeiden Sie SELECT *).
  • Vermeiden Sie Unterabfragen und ersetzen Sie sie durch Joins, insbesondere wenn sie eine große Ergebnismenge zurückgeben
  • Letzter Ausweg - beide tmp_table_sizeund erhöhen max_heap_table_size. Tun Sie dies nur, wenn Sie feststellen, dass Ihre Abfragen nicht optimiert werden können.

Wenn Sie sich Gedanken über Ihre MySQL-Konfiguration machen und sich mit den verfügbaren Einstellungen nicht wohl fühlen, sollten Sie sich als Ausgangspunkt den Percona-Konfigurationsassistenten ansehen .

Wird die Änderung der Datenbank-Engine von "myisam" in "memory" für Tabellen mit "group by" dieses Problem beheben? wie hier erklärt

Nein, das wird es nicht und es wird es so machen, dass Ihre Tabellen niemals auf der Festplatte bleiben. Mach das nicht.

Aaron Brown
quelle
+1, aber fügte hinzu, dass es die geringere tmp_table_sizeodermax_heap_table_size
Derek Downey
Die beste Empfehlung von mysqltuner war, das langsame Abfrageprotokoll zu aktivieren. Dies hilft Ihnen dabei, langsame Abfragen zu identifizieren.
fat_mike
2

"using temporary" und "using filesort" sind nicht das Ende der Welt!

SELECT ... GROUP BY a, b ORDER BY c, d - Erfordert 1 oder 2 "temporäre Tabellen".

Es gibt einfach Zeiten, in denen Ihre Abfragen temporäre Tabellen verwenden. Temporäre Tabellen können eine Abfrage um einen kleinen Faktor verlangsamen. Aber wenn die Abfrage immer noch "schnell genug" ist, machen Sie sich darüber keine Sorgen.

Wenn die Abfrage zu langsam ist (mit oder ohne tmp-Tabellen), diskutieren wir sie. Bitte geben Sie SHOW CREATE TABLE, SHOW TABLE STATUS und EXPLAIN an.

Rick James
quelle
1
Wenn Sie einen Index haben (a, b, c, d), wird es keine temporäre Tabelle geben.
Yvan,