2010-07-09 6 views
5

Prima di tutto, sono nuovo nell'ottimizzare mysql. Il fatto è che ho nella mia applicazione web (circa 400 query al secondo), una query che utilizza uno GROUP BY che non posso evitare e che è la causa della creazione di tabelle temporanee. La mia configurazione è:Configurazione ottimale delle tabelle temporanee MySQL (tabelle di memoria)?

max_heap_table_size = 16M 
tmp_table_size = 32M 

Il risultato: tabella temporanea per cento su disco + - 12,5%

Poi ho cambiato le mie impostazioni, in base alle this post

max_heap_table_size = 128M 
tmp_table_size = 128M 

Il risultato: tabella temporanea su disco percentuale + - 18%

I risultati non erano previsti, non capisco perché.

È sbagliato tmp_table_size = max_heap_table_size? Non dovrebbe aumentare la taglia?

Query

SELECT images, id 
FROM classifieds_ads 
WHERE parent_category = '1' AND published='1' AND outdated='0' 
GROUP BY aux_order 
ORDER BY date_lastmodified DESC 
LIMIT 0, 100; 

SPIEGARE

| 1 |SIMPLE|classifieds_ads | ref |parent_category, published, combined_parent_oudated_published, oudated | combined_parent_oudated_published | 7 | const,const,const | 67552 | Using where; Using temporary; Using filesort | 
+1

Non c'è bisogno di scusarsi - il tuo inglese è abbastanza buono. –

+0

D'accordo con OMG Pony; speriamo che nessuno sia scoraggiato dal fare domande nel caso in cui il loro inglese non sia brillante. –

+0

Il tuo inglese scritto è migliore di alcuni dei colleghi madrelingua inglesi con cui ho la sfortuna di lavorare! :) –

risposta

9

"Utilizzo temporaneo" nel rapporto di spiegare non ci dice che il tavolo temperatura era sul disco. Ci dice solo che la query si aspetta di creare una tabella temporanea.

La tabella temporanea rimane in memoria se la sua dimensione è inferiore a tmp_table_size e inferiore a max_heap_table_size.

Max_heap_table_size è il più grande che una tabella può essere nel motore di archiviazione MEMORY, indipendentemente dal fatto che quella tabella sia una tabella temporanea o una tabella non temporanea.

Tmp_table_size è il più grande che una tabella può essere in memoria quando viene creata automaticamente da una query. Ma questo non può essere più grande di max_heap_table_size comunque. Quindi non c'è alcun vantaggio nell'impostare tmp_table_size maggiore di max_heap_table_size. È comune impostare queste due variabili di configurazione sullo stesso valore.

È possibile controllare come sono state create molte tabelle temporanee, e quanti su disco come questo:

mysql> show global status like 'Created%'; 
+-------------------------+-------+ 
| Variable_name   | Value | 
+-------------------------+-------+ 
| Created_tmp_disk_tables | 20 | 
| Created_tmp_files  | 6  | 
| Created_tmp_tables  | 43 | 
+-------------------------+-------+ 

Nota In questo esempio, sono stati creati 43 tabelle temporanee, ma solo il 20 di coloro che erano sul disco.

Quando si aumentano i limiti di tmp_table_size e max_heap_table_size, si consente alle tabelle temporanee più grandi di esistere in memoria.

Si può chiedere, quanto è grande bisogno di farlo? Non è necessario renderlo sufficientemente grande per consentire ad ogni singola tabella temporanea di adattarsi alla memoria. Potresti volere che il 95% delle tue tabelle temporanee si inserisca in memoria e solo le restanti tabelle rare vengano salvate sul disco. Quegli ultimi 5% potrebbero essere molto grandi - molto più grandi della quantità di memoria che vuoi usare per quello.

Quindi la mia pratica è di aumentare tmp_table_size e max_heap_table_size in modo conservativo. Quindi guarda il rapporto di Created_tmp_disk_tables in Created_tmp_tables per vedere se ho raggiunto il mio obiettivo di fare in modo che il 95% di essi rimanga in memoria (o quale sia il rapporto che voglio vedere).

Sfortunatamente, MySQL non ha un buon modo per dirvi esattamente quanto erano grandi i tavoli temporanei. Questo può variare a seconda della query, quindi le variabili di stato non possono mostrarlo, possono solo mostrarti il ​​conto di quante volte si è verificato. E EXPLAIN in realtà non esegue la query in modo che non possa prevedere esattamente la quantità di dati che corrisponderà.

Un'alternativa è Percona Server, che è una distribuzione di MySQL con miglioramenti. Uno di questi è log extra information in the slow-query log. Incluso nei campi aggiuntivi è la dimensione di qualsiasi tabella temporanea creata da una determinata query.