it-swarm.com.de

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

Kann ein Konfigurationsfehler dazu führen, dass zu viele temporäre Tabellen von mysql..mysql-Tunershows 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%

Die frühere temporäre Tabelle war "von den 23725 temporären Tabellen wurden 38% auf der Festplatte erstellt", aber ich habe max_heap und tmp_table von 16 m auf 200 m 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 "von 23725 temporären Tabellen, 1% wurden auf der Festplatte erstellt" mit derselben Datenbank an.

Ich habe versucht, mit diesem Problem auf dem Computer die Standardeinstellungen 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 dies durch Ändern der DB-Engine von "myisam" in "memory" in Tabellen mit "group by" behoben? Wie hier erklärt: http://www.mysqlperformanceblog.com/2007/08/16/how-much-overhead-is-caused-by-on-disk-temporary-tables/

13
ananthan.nair

mysqltuner liefert selten nützliche Informationen. Es verwendet meist irrelevante Statistiken über "Trefferquoten" und setzt willkürliche Grenzen für eine akzeptable Anzahl akzeptabler Widgets. Wenn Sie nicht mit einem Leistungsproblem konfrontiert sind, müssen Sie keines der Probleme lösen, die sich daraus ergeben. Davon abgesehen finden Sie hier einige Hintergrundinformationen zu temporären Tabellen ...

MySQL verwendet intern die MEMORY-Speicher-Engine zum Erstellen impliziter temporärer Tabellen. Verwenden Sie auf temporären Festplattentabellen 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 die kleinere von tmp_table_size oder max_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 MySQL-Dokumentation in internen temporären Tabellen.

Was können Sie dagegen tun? Angenommen, es handelt sich tatsächlich um ein Leistungsproblem (anstatt Sie nur intelligent zu stören):

  • Vermeiden Sie TEXT/BLOB-Felder und verwenden Sie stattdessen nach Möglichkeit VARCHAR- oder CHAR-Felder mit geeigneter Größe.
  • Wenn TEXT/BLOB unvermeidbar sind, sequestrieren Sie sie in separate Tabellen mit einer Fremdschlüsselbeziehung und schließen Sie sich nur an, 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 Ergebnismenge zurückgeben, die Sie benötigen (entsprechend selektive WHERE-Klauseln, vermeiden Sie SELECT *).
  • Vermeiden Sie Unterabfragen und ersetzen Sie sie durch Verknüpfungen, insbesondere wenn sie eine große Ergebnismenge zurückgeben
  • Letzter Ausweg - beide erhöhen tmp_table_size und max_heap_table_size. Tun Sie dies nur, wenn Sie feststellen, dass Ihre Abfragen nicht optimiert werden können.

Wenn Sie sich Sorgen um Ihre MySQL-Konfiguration machen und mit den verfügbaren Einstellungen selbst nicht vertraut sind, sollten Sie sich den Percona Configuration Wizard als Ausgangspunkt ansehen.

Wird dies durch Ändern der DB-Engine von "myisam" in "memory" in Tabellen mit "group by" behoben? wie hier erklärt

Nein, das wird nicht so sein, dass Ihre Tabellen niemals auf der Festplatte gespeichert werden. Tu das nicht.

16
Aaron Brown

"using temporär" und "using filesort" sind nicht das Ende der Welt!

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

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

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

2
Rick James