Estou fazendo a interface de um banco de dados MySQL com PHP Data Objects (PDO) e executando uma extensa consulta SQL. Normalmente, leva cerca de 1500 ms; Ainda preciso otimizá-lo. Quando executo o script PHP duas vezes com um pequeno intervalo entre elas, a consulta leva apenas cerca de 90 ms. A consulta é a mesma em ambos os casos. Quando executo o script, com a mesma consulta, depois de algum tempo novamente, demora 1500 ms novamente.
Por que é que? O cache do banco de dados é feito 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 os resultados em cache, porque não pode saber se o banco de dados foi alterado.
Eu tenho um script rodando a cada minuto para inserir novas linhas no banco de dados. Isso também pode ser o motivo pelo qual demora 1500 ms novamente após algum tempo; o cache teria sido excluído, porque as tabelas relevantes não são mais as mesmas.
Este é provavelmente um artefato do MySQL Query Cache .
Você executa a consulta SQL, o MySQL armazena em cache seu resultado e a próxima execução é rápida. Quando você executa o script para inserir os dados nas tabelas referenciadas por sua consulta, o cache de resultados é invalidado e a consulta deve ser executada "de verdade" na próxima vez.
Da documentação do MySQL vinculada acima:
Sim, mySQL (em comum com todos os outros produtos de banco de dados populares) armazena em cache as consultas feitas a ele.
O armazenamento em 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 de banco de dados; você não tem visibilidade do que o cache contém, nem quanto tempo um determinado item permanece no cache; ele pode ser sobrescrito a qualquer momento, dependendo de quais outras consultas estão sendo chamadas, etc. Ele existe para ajudar no desempenho, mas não deve ser usado para desempenho.
Você pode ler mais sobre isso aqui no manual do MySQL
Além disso, usar o PDO permite que você escreva suas consultas como "declarações preparadas", ligando os parâmetros em vez de codificá-los em uma string de consulta de texto simples. Isso também tem implicação de cache no servidor de banco de dados e, para consultas repetidas, também melhora o desempenho.