MySQL - force a não usar cache para testar a velocidade da consulta


343

Estou testando a velocidade de algumas consultas no MySQL. O banco de dados está armazenando essas consultas em cache, dificultando a obtenção de resultados confiáveis ​​ao testar a rapidez com que essas consultas são.

Existe uma maneira de desativar o cache para uma consulta?

Sistema: MySQL 4 no Linux, tenho acesso ao PHPMyAdmin.

obrigado

mysql 

Respostas:


527

Tente usar a opção SQL_NO_CACHE (MySQL 5.7) em sua consulta. (Usuários do MySQL 5.6 clicam AQUI )

por exemplo.

SELECT SQL_NO_CACHE * FROM TABLE

Isso interromperá o cache do MySQL nos resultados, no entanto, esteja ciente de que outros caches de SO e disco também podem afetar o desempenho. Estes são mais difíceis de contornar.



4
Um bom artigo sobre o cache de consultas do mysql. Como configurar e ver o cache em ação! Vale a leitura. databasejournal.com/features/mysql/article.php/3110171/…
Adrian P.

11
Antes de tentar melhorar o desempenho, tente reiniciar o servidor mysql. Pode ser que algum processo esteja afetando tudo. Isso aconteceu comigo. Embora seja um comentário que não tenha conexão direta com o problema, ele pode ajudar muitas pessoas.
Dellasavia

2
Isso impede o armazenamento em cache dos resultados, mas também o impede de usar o cache?
Brett

3
@Brett vê o comentário de SalmanPK em 11. Essa página de documento é literalmente 4 sentenças e responde sua pergunta diretamente. Caso a página seja removida no futuro: "Ela não verifica o cache da consulta para ver se o resultado já está armazenado em cache, nem o resultado da consulta."
151715

121

Outra alternativa que afeta apenas a conexão atual:

SET SESSION query_cache_type=0;

Foi mal. Era para quem query_cache_sizeeu estava olhando, não query_cache_type. Eu estava misturando a sua e a resposta do SeniorDev.
23413 Mike


30

Há também a opção de configuração: query_cache_size = 0

Para desativar o cache de consulta na inicialização do servidor, defina a variável de sistema query_cache_size como 0. Ao desativar o código do cache de consulta, não há sobrecarga perceptível. Se você construir o MySQL a partir da fonte, os recursos de cache de consulta poderão ser excluídos inteiramente do servidor, invocando o configure com a opção --without-query-cache.

Consulte http://dev.mysql.com/doc/refman/5.1/en/query-cache.html


24

Você também pode executar o comando follow para redefinir o cache da consulta.

RESET QUERY CACHE

9
Provavelmente isso é um exagero ... idealmente, você só quer que o MySQL ignore temporariamente o cache.
BMiner 21/09

3
Você também precisa de permissões especiais para isso.
Erick Robertson

19

Um problema com o

SELECT SQL_NO_CACHE * FROM TABLE

O método é que parece impedir apenas que o resultado da sua consulta seja armazenado em cache. No entanto, se você estiver consultando um banco de dados que está sendo usado ativamente com a consulta que deseja testar, outros clientes poderão fazer cache da sua consulta, afetando seus resultados. Eu continuo pesquisando maneiras de contornar isso, editarei este post se eu descobrir um.


11
Mas se o seu cache for preenchido por outras pessoas, você terá a ilusão de ser rápido. Mas às vezes não.
karatedog

14

Eu usaria o seguinte:

SHOW VARIABLES LIKE 'query_cache_type';
SET SESSION query_cache_type = OFF;
SHOW VARIABLES LIKE 'query_cache_type';

3

O uso de uma variável definida pelo usuário em uma consulta faz com que a consulta seja novamente recuperável. Achei um indicador muito melhor do que usar SQL_NO_CACHE. Mas você deve colocar a variável em um local em que a configuração da variável não afete seriamente o desempenho:

SELECT t.*
FROM thetable t, (SELECT @a:=NULL) as init;

3
"Achei um indicador muito melhor do que usar SQL_NO_CACHE". Como assim? Parece que você precisaria de um argumento bastante forte para usar um hack obscuro sobre uma palavra-chave explícita, a menos que a palavra-chave explícita não esteja fazendo o que afirma.
Ar

11
@ Air Encontrei esta solução para funcionar melhor do que SQL_NO_CACHE também. SQL_NO_CACHE trabalhou pela primeira vez executando a consulta, mas depois disso não funcionou novamente. Estou assumindo que isso se deve a outros mecanismos de armazenamento em cache. Eu acho que isso funciona melhor porque uma pesquisa que depende de uma variável não pode ser armazenada em cache por qualquer camada ou mecanismo - pelo menos, esse é o meu melhor palpite.
Klik

2

Se você deseja desativar o cache de consulta, defina 'query_cache_size' como 0 no seu arquivo de configuração mysql. Se o seu conjunto 0, o mysql não usará o cache de consulta.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.