O MySQL armazena consultas em cache?

19

Estou fazendo interface com um banco de dados MySQL com PHP Data Objects (PDO) e executando uma extensa consulta SQL. Normalmente, leva cerca de 1500 ms; Eu ainda preciso otimizá-lo. Quando executo o script PHP duas vezes com um curto intervalo, a consulta leva apenas cerca de 90 ms. A consulta é nos dois casos a mesma. Quando executo o script, com a mesma consulta, depois de algum tempo novamente, são necessários 1500 ms novamente.

Por que é que? O banco de dados é armazenado em cache automaticamente? Há algum tempo em que o banco de dados salva o cache e o exclui automaticamente?

Presumo que os resultados não possam ser armazenados em cache pelo PHP, porque isso acontece em dois threads diferentes. Eu não acho que o PHP armazenaria em cache os resultados, porque ele não pode saber se o banco de dados mudou.

Eu tenho um script em execução a cada minuto para inserir novas linhas no banco de dados. Esse também pode ser o motivo pelo qual são necessários 1500 ms novamente após algum tempo; o cache teria sido excluído, porque as tabelas relevantes não são mais as mesmas.

Peter Mortensen
fonte
Mostre-me o seu código. Eu não preciso da sua consulta, apenas uma maneira de como você a está testando.
3
Sim, o mySQL armazena em cache as consultas. É inteligente assim.
@Kasyx what code? É apenas DOP básico, mas não acho que o PHP possa armazená-lo em cache porque eu executo o script PHP duas vezes, não executo a consulta duas vezes em um script. Além disso, você poderia explicar por que editou o pdo enquanto ele não é realmente relevante para a pergunta?
3
Todos os DBMSes têm algum tipo de cache no nível da página. Muitos vão além disso, armazenando em cache os planos de execução de consultas ou mesmo resultados de consultas (incluindo MySQL ). Suspeito que esta última coisa seja o principal culpado pelo seu comportamento observado.
Branko Dimitrijevic
Você está fazendo inserções a cada minuto? Resolva isso primeiro!
Grant Thomas

Respostas:

15

Provavelmente, este é um artefato do MySQL Query Cache .

Você executa a consulta SQL, o MySQL armazena em cache o resultado e a próxima execução se for rápida. Quando você executa o script para inserir os dados nas tabelas referenciadas pela sua consulta, o cache de resultados é invalidado e a consulta deve ser executada "de verdade" na próxima vez.

Na documentação do MySQL vinculada acima:

Um mix de consulta que consiste quase inteiramente de um conjunto fixo de instruções SELECT tem muito mais probabilidade de se beneficiar da ativação do cache do que um mix no qual instruções INSERT frequentes causam invalidação contínua dos resultados no cache.

Branko Dimitrijevic
fonte
5

Sim, o mySQL (em comum com todos os outros produtos populares de banco de dados) armazena em cache as consultas feitas a ele.

O cache é bastante inteligente - geralmente pode usar um cache para uma consulta, mesmo que os parâmetros exatos da consulta não sejam os mesmos. Isso pode fazer uma grande diferença no desempenho.

O armazenamento em cache é controlado inteiramente dentro do software do servidor DB; você não tem nenhuma visibilidade do que o cache contém, nem por quanto tempo um determinado item permanece no cache; ela pode ser substituída a qualquer momento, dependendo de como outras consultas estão sendo chamadas etc. Ela existe para ajudar no desempenho, mas não deve ser invocada para o desempenho.

Você pode ler mais sobre isso aqui no manual do MySQL .

Além disso, o uso do PDO permite que você escreva suas consultas como "Instruções preparadas", vinculando os parâmetros em vez de codificá-los em uma string de consulta em texto sem formatação. Isso também tem implicações de cache no servidor de banco de dados e, para consultas repetidas, também melhora o desempenho.


fonte
2
"No MySQL 5.1.17, o cache de consulta é usado para instruções preparadas sob as condições descritas na Seção 8.6.3.1," Como o cache de consulta opera ". Antes de 5.1.17, o cache de consulta não era usado para instruções preparadas." dev.mysql.com/doc/refman/5.1/en/query-cache.html
1
" em comum com todos os outros produtos populares de banco de dados ": isso é um pouco enganador. Quase nenhum DBMS armazena em cache ativamente os resultados da consulta, como o MySQL. DBMS normalmente só tabela de cache (ou índice) de dados , e não de consulta resultados . A maioria deles fazer o cache do plano de consulta exeution (e a consulta "fonte")
a_horse_with_no_name
3
"muitas vezes pode usar um cache para uma consulta, mesmo que os parâmetros exatos da consulta não sejam os mesmos" esteja completamente incorreto. A consulta deve ser byte por byte idêntica a uma consulta executada anteriormente e ainda armazenada em cache para ser veiculada no cache. Mesmo a diferença entre SELECT *e select *significa que uma consulta idêntica não será atendida no cache. dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html . Publicado o link 5.1 para obter consistência, mas se aplica a todas as versões.
Michael - sqlbot