2012-11-06 5 views
45

Sul mio server 2 giorni fa il mio tmp_table_size = max_heap_table_size(16M).Mysql tmp_table_size max_heap_table_size

Ho fatto un job cron che viene eseguito una volta all'ora e genera un report a partire da: created_tmp_disk_tables, created_tmp_files, created_tmp_tables

Nella mia relazione: created_tmp_disk_tables + created_tmp_files + created_tmp_tables = 100% dei miei dati temporanei

con che:

  1. con tmp_table_size = max_heap_table_size = 16M il rapporto mi ha mostrato il rapporto medio prossimo:
    • 27.37% (created_tmp_disk_tables)
    • 1,16% (created_tmp_files)
    • 71.48% (created_tmp_tables)

Come posso ottimizzare questi risultati?

  1. con tmp_table_size = max_heap_table_size = 20M nella prima ora:

    • 23,48% (created_tmp_disk_tables)
    • 32.44% (created_tmp_files)
    • 44.07% (created_tmp_tables)

dopo 7 ore (da riavvio):

  • 21,70% (created_tmp_disk_tables)
  • 33.75% (created_tmp_files)
  • 44.55% (created_tmp_tables)

Non è quello che mi aspettavo.

  • tavoli disco diminuito 27.37%-21.70% -> aspettavo molto di più
  • file temporanei salgono forma 1.16% a 33.75% -> perché?
  • tabelle di memoria diminuite da 71.48% a 44.55% -> strano; dovrebbe aumentare

risposta

153

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:

  1. elaborazione query deve fermare
  2. Creare una tabella temporanea su disco
  3. trasferimento il contenuto della tabella temporanea basato sulla memoria nella tabella temporanea su disco
  4. Goccia nella tabella temporanea basata sulla memoria
  5. 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.

+10

Questa è una risposta eccellente e degna di fiducia. Solo una nota per chiunque si trovi qui. – usumoio