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.
Respostas:
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:
fonte
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
SELECT *
eselect *
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.