Perché MySQL sta creando così tante tabelle temporanee su disco?


13

Qualunque errore di configurazione può portare alla creazione di troppe tabelle temporanee con i programmi di sintonizzazione mysql..mysql

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%

La precedente tabella temporanea era "delle 23725 tabelle temporanee 38% sono state create su disco" ma ho cambiato max_heap e tmp_table a 200m da 16m e si è ridotto al 30% ..

Configurazione:

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

Un altro sistema con configurazione predefinita mostra "di 23725 tabelle temporanee, l'1% sono state create su disco" con lo stesso database.

Ho provato a cambiare l'impostazione predefinita sulla macchina con questo problema e mostra ancora "Delle 580 tabelle temporanee, il 16% è stato creato su disco".

Sto usando Ubuntu 11.4 a 64 bit con ram da 48 GB. Qualcuno può suggerire una soluzione?

Cambiando il motore db da "myisam" a "memoria" sui tavoli usando "raggruppa per" risolverai questo problema? Come spiegato qui: http://www.mysqlperformanceblog.com/2007/08/16/how-much-overhead-is-caused-by-on-disk-temporary-tables/

Risposte:


16

mysqltuner raramente fornisce informazioni utili. Utilizza statistiche per lo più irrilevanti sui "tassi di successo" e pone limiti arbitrari su ciò che è accettabile un numero di widget. Se non si verificano problemi di prestazioni, non è necessario risolvere nessuno dei problemi che presenta. Detto questo, ecco alcune informazioni di base sulle tabelle temporanee ...

MySQL utilizza internamente il motore di archiviazione MEMORY per creare tabelle temporanee implicite. Sulle tabelle temporanee su disco utilizzare il motore di archiviazione MyISAM.

Le tabelle temporanee vengono create sul disco quando:

  • I campi TEXT o BLOB sono presenti (poiché MEMORY non supporta questi tipi)
  • la dimensione della tabella temporanea implicita risultante supera la minore di tmp_table_sizeomax_heap_table_size
  • Se una colonna con più di 512 byte viene utilizzata con GROUP BY o UNION o ORDER BY

Leggi la documentazione di MySQL sulle tabelle temporanee interne per maggiori dettagli.

Cosa puoi fare al riguardo? Presumendo che in realtà rappresenti un problema di prestazioni (piuttosto che disturbarti intellettualmente):

  • Evita i campi TEXT / BLOB e utilizza invece campi VARCHAR o CHAR di dimensioni adeguate, ove possibile.
  • Se TEXT / BLOB sono inevitabili, sequestrarli per separare le tabelle con una relazione di chiave esterna e JOIN solo quando ne hai bisogno.
  • Tratta colonne di grandi dimensioni, più di 512 byte come faresti con i campi TEXT / BLOB sopra menzionati.
  • Assicurarsi che le query restituiscano solo il set di risultati necessario (clausole WHERE opportunamente selettive, evitare SELECT *)
  • Evita le subquery e sostituiscile con i join, soprattutto se restituiscono un set di risultati di grandi dimensioni
  • Ultima risorsa: rilanciare entrambi tmp_table_sizee max_heap_table_size. Non farlo se non scopri che le tue query non possono essere ottimizzate.

Se sei preoccupato per la tua configurazione MySQL e non ti senti a tuo agio con le impostazioni disponibili tu stesso, potresti voler dare un'occhiata alla procedura guidata di configurazione Percona come punto di partenza.

Cambiando il motore db da "myisam" a "memoria" sui tavoli usando "raggruppa per" risolverai questo problema? come spiegato qui

No, non lo farà e lo renderà tale che le tue tabelle non vengano mai mantenute su disco. Non farlo


+1, ma ha aggiunto che è il minore di tmp_table_sizeomax_heap_table_size
Derek Downey

La migliore raccomandazione di mysqltuner è stata quella di abilitare il registro delle query lente. Ti aiuterà a identificare eventuali query lente.
fat_mike

2

"using temporary" e "using filesort" non sono la fine del mondo!

SELEZIONA ... Raggruppa per a, b ORDINA PER c, d - Richiede 1 o 2 "tabelle temporanee".

Ci sono semplicemente momenti in cui le tue query useranno le tabelle temporanee. Le tabelle temporanee possono rallentare una query di un piccolo fattore. Ma se la query è ancora "abbastanza veloce", non preoccuparti.

Se la query è troppo lenta (con o senza tabelle tmp), discutiamola. Fornisci SHOW CREATE TABLE, SHOW TABLE STATUS ed EXPLAIN.


1
Se hai un indice attivo (a, b, c, d), non ci sarà alcuna tabella temporanea.
Yvan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.