Ogni volta che si aumenta tmp_table_size e max_heap_table_size, tenere presente che l'impostazione di queste non rende le query si comportano meglio. In realtà, le query inefficienti si comportano in modo peggiore di prima. In quali circostanze?
Quando una query esegue un join o un ordinamento (tramite ORDER BY
) senza il beneficio di un indice, una tabella temporanea deve essere formata in memoria. Ciò incrementerebbe Created_tmp_tables.
Cosa succede se la tabella temporanea cresce al numero di byte in tmp_table_size e richiede più spazio? La seguente sequenza di eventi si verifica:
- elaborazione query deve fermare
- Creare una tabella temporanea su disco
- trasferimento il contenuto della tabella temporanea basato sulla memoria nella tabella temporanea su disco
- Goccia nella tabella temporanea basata sulla memoria
- trasformazione Query continuare utilizzando la tabella temporanea su disco
Questo processo incrementa Created_tmp_disk_tables
Conoscere questi meccanismi, esploriamo quello che è successo in ogni caso
tavoli disco è diminuito da 27.37% a 21.70% -> aspettavo molto di più
questo potrebbe facilmente accadere se le query che ha funzionato prima di aver memorizzato nella cache i risultati rimanenti nella RAM. Ciò eliminerebbe la necessità di elaborare la query dall'inizio e non ricreare le stesse tabelle temporanee di grandi dimensioni.
file temporanei in aumento da 1,16% a 33,75% -> perché?
Questo non è sorprendente. Questo fa semplicemente emergere il fatto che ci sono query che richiedono tabelle temporanee. Sono stati creati prima nella RAM. Ciò indica solo la presenza di query che non si integrano correttamente (forse join_buffer_size è troppo piccola) o ORDER BY
colonne o colonne non indicizzate con una tabella temporanea (forse sort_buffer_size è troppo piccola).
le tabelle di memoria sono diminuite dal 71,48% al 44,55% -> strano; dovrebbe aumentare
Questo non è sorprendente neanche. Se ci sono abbastanza chiamate per la stessa query con gli stessi valori, gli ordinamenti e i join possono essere prevenuti dall'adempimento di query da risultati precedentemente memorizzati nella cache.
RACCOMANDAZIONE
Alla luce di queste cose, qui è quello che potrebbe essere regolato:
L'obiettivo generale dovrebbe essere quello di impedire la creazione tabella temporanea, per quanto possibile.Semplicemente aumentando tmp_table_size e max_heap_table_size, le query inefficienti e le tabelle prive di indicizzazione corretta sono un problema.
Questa è una risposta eccellente e degna di fiducia. Solo una nota per chiunque si trovi qui. – usumoio