Ottimizzazione (e comprensione) table_cache in mySQL


18

Ho eseguito l'eccellente script di ottimizzazione delle prestazioni di MySQL e ho iniziato a elaborare i suggerimenti. Quello in cui mi sono imbattuto è stato

TABELLA CACHE
Valore table_cache corrente = 4096 tabelle Hai un totale di 1073 tabelle. Hai 3900 tavoli aperti. La percentuale di hit della table_cache corrente è del 2%, mentre il 95% della cache della tabella è in uso. Probabilmente dovresti aumentare table_cache

Ho iniziato a leggere su table_cache ma ho trovato abbastanza carente la documentazione di MySQL . Dicono per aumentare il table_cache"se hai la memoria". Sfortunatamente la table_cachevariabile è definita come "Il numero di tabelle aperte per tutti i thread".

Come cambierà la memoria utilizzata da MySQL, se aumento questa variabile? Qual è un buon valore, per impostarlo?

Risposte:


16

Dalla documentazione di MySQL

Ad esempio, per 200 connessioni in esecuzione simultanee, è necessario disporre di una dimensione cache della tabella di almeno 200 × N, dove N è il numero massimo di tabelle per join in una qualsiasi delle query eseguite. È inoltre necessario riservare alcuni descrittori di file extra per tabelle e file temporanei.

Quindi, se nella tua applicazione hai una query che unisce 4 tabelle e vuoi essere in grado di gestire 200 connessioni simultanee, basandoti su quell'istruzione dovresti avere table_cache di almeno 800.

Per quanto riguarda l'utilizzo della memoria, non ho quei numeri, sospetto che dipenderà dalle dimensioni delle tabelle che sta memorizzando nella cache.


Grazie per il puntatore. Ho un po 'paura di aumentare il mio numero table_cache senza sapere come cambierà l'utilizzo della RAM. La RAM della macchina è già piena.
jotango,

Sei sicuro che la memoria sia effettivamente esaurita o che solo la memoria sia stata occupata da buffer / cache? Esegui "free -m" e guarda la seconda riga (- / + buffer / cache), questa è una rappresentazione più accurata dell'utilizzo della memoria in mb. Vedi le risposte in serverfault.com/questions/73189/… e serverfault.com/questions/9442/…
ManiacZX,

Sì, sta davvero usando la memoria. Ieri è stato scambiato, il che è davvero negativo per un db di produzione. Oggi ho ordinato un aggiornamento della RAM da HP.
jotango,

per quelli che arrivano ora, questa risposta non è precisa per mysql 5.1+. ora fa riferimento a table_open_cachequando guardi i documenti. Vedi la risposta di @MarkRs guardandotable_cache
Jason,

3

Dovresti monitorare la variabile Opened_Tables e vedere con che velocità aumenta. Se è significativamente più veloce della creazione di nuove tabelle (comprese quelle temporanee), la cache delle tabelle potrebbe essere troppo piccola.

Table_Cache dovrebbe sempre - anche se in gran parte comunque - essere significativamente più grande del numero totale di tabelle nel server. Altrimenti continuerà ad aprire e chiudere i tavoli.

Non riesco a vedere come si possa ottenere un tasso di hit della cache del 2%, a meno che non si stia misurando il tempo subito dopo il riavvio del server o utilizzando molto FLUSH TABLES (in relazione al numero di query). Normalmente la percentuale di hit della cache della tabella dovrebbe essere del 99,9%, altrimenti le prestazioni risulteranno dannose.

Non fare un TAVOLO FLUSH se puoi evitarlo, spazza via la cache.

L'apertura delle tabelle è costosa in quanto deve leggere il file FRM. In MyISAM è significativamente peggio (rispetto ad altri motori), poiché quando chiude una tabella, elimina anche tutti i blocchi nella cache delle chiavi provenienti dai suoi indici. Quindi chiudere una tabella scarica i suoi indici dalla chiave cache == non va bene! Altri motori mantengono i blocchi memorizzati nella cache ma devono ancora rileggere i metadati e allocare alcune strutture.

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.