Existe uma maneira de dizer ao MySQL que algumas consultas têm prioridade mais alta no cache e não devem ser exibidas até que seus dados se tornem inválidos?
O problema é que o tamanho do cache do innodb é bastante pequeno e os dados de consultas pesadas "Principais" são exibidos rapidamente devido a outras consultas usadas com frequência.
Portanto, queremos dizer: "esses dados de consulta principais DEVEM permanecer no cache. Se o cache estiver cheio, nenhum dado principal será exibido até que se torne inválido. Se o cache estiver cheio de dados principais, nenhuma outra consulta usará o cache".
Algumas informações: engine=InnoDB. O cache está ativado e as diretivas SQL_(NO)_CACHE não são usadas nas consultas do aplicativo. O cache é grande o suficiente para armazenar todos os dados principais e muitos dados "quentes", mas muito pequeno para armazenar até 5% de todos os dados de consultas. É desejável usar o cache em todas as consultas, mas eles não devem substituir os dados principais
Em primeiro lugar, existem dois caches relevantes para sua consulta.
O cache de consulta usa
SQL_(NO)_CACHE
e é o cache menos importante. Para sistemas de produção com muitas gravações, você também pode desligar o QC. Cada gravação em uma tabela libera todas as entradas no QC para a(s) tabela(s) envolvida(s). Isso leva a outro ponto: um QC grande pode levar a muita atividade de descarga. Limitequery_cache_size
a não mais do que cerca de 50M. O QC pode ajudar com a CPU.O buffer_pool é o cache importante para o InnoDB. Você deve dar cerca de 70% da RAM para
innodb_buffer_pool_size
. É aí que os blocos de dados e índices do InnoDB são armazenados em cache. Isso ajuda porque evita muito do I/O.Muitas vezes, a coisa mais importante a fazer é identificar as consultas mais lentas (usando
SHOW PROCESSLIST
e/ou o slowlog) e trabalhar para acelerá-las. Às vezes, adicionar um índice, às vezes uma pequena alteração em um SELECT, etc, pode acelerar o sistema muito mais do que ajustar os tamanhos do cache.O buffer_pool tem uma maneira de evitar que uma varredura de tabela elimine o cache. O QC não tem nenhum mecanismo como o que você está pedindo.
Se você mantiver o QC ativado, defina
query_cache_type=DEMAND
e useSQL_(NO)_CACHE
.