Dovresti semplicemente disabilitare la cache delle query con
[mysqld]
query_cache_size = 0
e quindi riavviare mysql. Perché dovrei suggerirlo ???
La query cache sarà sempre testa a testa con InnoDB. Sarebbe bello se MVCC di InnoDB consentisse di eseguire query dalla cache delle query se le modifiche non influiscono sulle letture ripetibili per altre transazioni. Sfortunatamente, InnoDB non lo fa. Apparentemente, hai molte domande che vengono invalidate piuttosto rapidamente e probabilmente non vengono riutilizzate.
Per InnoDB in MySQL 4.0, la cache delle query è stata disabilitata per le transazioni. Per MySQL 4.1+, InnoDB riproduce il traffic traffic quando consente l'accesso alla cache delle query in base alla tabella.
Dal punto di vista della tua domanda, direi che la giustificazione della rimozione della cache delle query non è tanto l'overhead, ma il modo in cui InnoDB lo gestisce.
Per ulteriori informazioni su come InnoDB interagisce con la cache delle query, leggere le pagine 213-215 del libro "MySQL ad alte prestazioni (seconda edizione)" .
Se tutti o la maggior parte dei tuoi dati è MyISAM, potresti seguire l'idea originale di utilizzare SQL_NO_CACHE.
Se disponi di un mix di InnoDB e MyISAM, dovrai trovare il giusto equilibrio per la tua applicazione in base all'entità della perdita di cache. In effetti, le pagine 209-210 dello stesso libro indicano i motivi per cui mancano i cache:
- La query non è memorizzabile nella cache, perché contiene un costrutto non deterministico (come CURRENT_DATE) o perché il set di risultati è troppo grande per essere archiviato. Entrambi i tipi di query non memorizzabili incrementano la variabile di stato Qcache_not_cached.
- Il server non ha mai visto la query prima, quindi non ha mai avuto la possibilità di memorizzarne il risultato nella cache.
- Il risultato della query era precedentemente memorizzato nella cache, ma il server lo ha rimosso. Questo può accadere perché non c'era memoria sufficiente per conservarlo, perché qualcuno ha incaricato il server di rimuoverlo o perché è stato invalidato
e le cause alla radice di mancati errori nella cache con poche query invariabili potrebbero essere:
- La cache delle query non è ancora calda. Cioè il server non ha avuto la possibilità di riempire la cache con set di risultati.
- Il server sta visualizzando query che non ha mai visto prima. Se non si hanno molte query ripetute, ciò può accadere anche dopo il riscaldamento della cache.
- Esistono molte invalidazioni della cache.
AGGIORNAMENTO 2012-09-06 10:10 EDT
Guardando le tue ultime informazioni aggiornate, hai query_cache_limit
impostato su 1048576 (1M). Ciò limita qualsiasi risultato impostato su 1M. Se recuperi qualcosa di più grande, semplicemente non verrà memorizzato nella cache. Sebbene sia stato query_cache_size
impostato su 104857600 (100 M), ciò consente di impostare solo 100 risultati memorizzati nella cache in un mondo perfetto. Se esegui centinaia di query, la frammentazione avverrà piuttosto rapidamente. Hai anche 4096 (4K) come set di risultati di dimensione minima. Sfortunatamente, mysql non ha alcun meccanismo interno per deframmentare la cache delle query.
Se devi disporre della cache delle query e hai così tanta RAM, puoi eseguire quanto segue:
SET GLOBAL query_cache_size = 0;
SELECT SLEEP(60);
SET GLOBAL query_cache_size = 1024 * 1024 * 1024;
per eliminare la cache delle query. Si perdono tutti i risultati memorizzati nella cache, quindi eseguire queste righe durante le ore non di punta.
Vorrei anche assegnare quanto segue:
- query_cache_size = 1G
- query_cache_limit = 8M
Questo lascia 23G di RAM. Vorrei sollevare quanto segue:
- innodb_buffer_pool_size = 12G
- key_buffer_size = 4G
Questo lascia il 7G. Questo dovrebbe essere adeguato per connessioni OS e DB.
Tenere presente che il buffer delle chiavi memorizza nella cache solo le pagine dell'indice MyISAM, mentre il pool di buffer InnoDB memorizza nella cache dati e indici.
Un'altra raccomandazione: aggiornare a MySQL 5.5 in modo da poter configurare InnoDB per più CPU e thread multipli per I / O di lettura / scrittura.
Vedi i miei post precedenti sull'utilizzo di MySQL 5.5 in combinazione con l'accesso a più CPU per InnoDB
AGGIORNAMENTO 2012-09-06 14:56 EDT
Il mio metodo per svuotare la cache delle query è piuttosto estremo perché contiene i dati memorizzati nella cache e forma un segmento completamente diverso di RAM. Come hai sottolineato nel tuo commento, FLUSH QUERY CACHE
(come hai suggerito) o addirittura RESET QUERY CACHE
sarebbe meglio. Per chiarimenti, quando ho detto "nessun meccanismo interno", intendevo esattamente questo. La deframmentazione è necessaria e deve essere eseguita manualmente. Dovrebbe essere crontab'd .
Se fai DML (INSERT, UPDATE, DELETE) su InnoDB più spesso che su MyISAM, direi di rimuovere del tutto la cache delle query, che ho detto all'inizio.