Armazenando em cache os resultados do db - é necessário um empurrãozinho sobre como começar

6

Eu tenho um projeto chegando onde um dos requisitos será armazenar em cache o que é essencialmente dados somente leitura, a fim de diminuir a pressão sobre o banco de dados. Estou um pouco confuso sobre como o cache funciona com um banco de dados.

Como funciona o armazenamento em cache? Eu vi algo chamado cache de consulta, mas essa consulta de cache resulta ? Ou apenas as consultas? E não é uma visão uma forma de armazenamento em cache de qualquer maneira?

Estou apenas procurando um empurrãozinho na direção certa. O projeto usará o MySQL 5.1 para a loja, então qualquer link que possa esclarecer minha confusão seria uma grande ajuda. Uma pesquisa geral do Google só me forneceu o cache de consultas e, com minha falta de conhecimento nessa área, não tenho certeza se essa é a direção que devo seguir.

    
por Major Productions 07.12.2011 / 21:37

2 respostas

8

O cache de consulta do MySQL de fato armazena em cache os resultados da consulta e como Enquanto as consultas subsequentes forem exatamente iguais, o resultado calculado será fornecido em vez de executar a consulta. O MySQL também irá ignorar o cálculo do plano de execução.

Para usá-lo, você pode ativá-lo my.cnf do seu servidor ou use a dica SQL_CACHE na frente de suas consultas. Se você o tiver ativado no my.cnf, você pode dizer ao MySQL para não armazenar em cache um resultado usando SQL_NO_CACHE na frente de suas consultas.

Qualquer gravação (INSERT, UPDATE, DELETE, etc.) em uma tabela invalidará todas as entradas no cache de consulta que vieram dessa tabela.

Uma anomalia de desempenho com o cache de consulta: ele usa um algoritmo ineficiente para localizar entradas no cache, de modo que criar um cache maior pode resultar em pior desempenho . Você deve experimentar alterá-lo com seus próprios dados e perfis de consulta, mas a última vez que fiz esse experimento, descobri que cerca de 256 MB era o ponto ideal. Maior ou menor que isso e o desempenho piorou. O manual sugere " Dezenas de megabytes "

Você também pode implementar o cache fora do MySQL usando algo como memcached . Isso não é transparente para o aplicativo, portanto, você terá que adicionar código extra em seu aplicativo para lidar com a pesquisa no memcached e, em seguida, se falhar, fazer a pesquisa no banco de dados e armazenar o resultado no memcached.

    
por 07.12.2011 / 21:49
3

Você poderia fazer isso de várias maneiras. Provavelmente, existem outras maneiras de fazer isso, mas essas duas vêm à mente instantaneamente.

Você poderia criar outra tabela para manter seus resultados armazenados em cache e, em uma programação, executar as consultas caras que podem unir várias tabelas com lotes de registros nelas e despejar os registros nessa tabela. Fazer um SELECT * de uma única tabela deve ser menos dispendioso do que fazer um SELECT que junte 12 tabelas diferentes, cada uma com milhões de registros. Embora isso não remova exatamente o trabalho do servidor de banco de dados, ele deve reduzir a carga de trabalho computacional, bastando apenas fazer as consultas caras em um agendamento e fazer com que seus clientes regulares recuperem dados da tabela de cache.

Como alternativa, para um cache totalmente separado do seu banco de dados, você poderia implementar algo como Redis . Isso armazenará dados na memória e deverá ser super rápido, mas precisará de alguma lógica extra em seu aplicativo para usar isso como uma fonte de dados em vez do banco de dados real. Ele também se adapta bem - a rede do Stack Exchange o utiliza de maneira bastante eficaz em seus sites.

    
por 07.12.2011 / 21:53

Tags