Meu aplicativo é muito intensivo em banco de dados. Atualmente, estou executando o MySQL 5.5.19 e usando o MyISAM, mas estou migrando para o InnoDB. O único problema que resta é o desempenho da soma de verificação.
Meu aplicativo faz cerca de 500-1000 CHECKSUM TABLE
instruções por segundo em horários de pico, porque a GUI do cliente está pesquisando constantemente o banco de dados em busca de alterações (é um sistema de monitoramento, portanto deve ser muito responsivo e rápido).
Com o MyISAM, existem somas de verificação ao vivo que são pré-calculadas na modificação da tabela e são MUITO rápidas. No entanto, não existe tal coisa no InnoDB. Então, CHECKSUM TABLE
é MUITO lento.
Eu esperava poder verificar o horário da última atualização da tabela, infelizmente, isso também não está disponível no InnoDB. Estou preso agora, porque os testes mostraram que o desempenho do aplicativo cai drasticamente.
Existem simplesmente muitas linhas de código que atualizam as tabelas, portanto, implementar a lógica no aplicativo para registrar as alterações da tabela está fora de questão.
Existe algum método rápido para detectar alterações nas tabelas do InnoDB?
Para a tabela mydb.mytable, execute esta consulta:
Se você quiser saber quais tabelas foram alteradas nos últimos 5 minutos, execute isto:
De uma chance !!!
ATUALIZAÇÃO 2011-12-21 20:04 EDT
Meu empregador (empresa de hospedagem DB/Wweb) tem um cliente com 112.000 tabelas InnoDB. É muito difícil ler INFORMATION_SCHEMA.TABLES durante os horários de pico. Tenho uma sugestão alternativa:
Se você tiver o innodb_file_per_table habilitado e todas as tabelas do InnoDB estiverem armazenadas em
.ibd
arquivos, existe uma maneira de verificar a hora da última atualização (até o minuto).Para a tabela mydb.mytable, faça o seguinte no sistema operacional:
Este carimbo de data/hora é do sistema operacional. Você não pode errar neste.
ATUALIZAÇÃO 2011-12-21 22:04 EDT [mysqld] innodb_max_dirty_pages_pct=0;
Adicione isso ao my.cnf, reinicie o mysql e todas as tabelas do InnoDB experimentarão descargas rápidas do buffer pool.
Para evitar reiniciar, basta executar
ATUALIZAÇÃO 2013-06-27 07:15 EDT
Quando se trata de recuperar a data e hora de um arquivo, ls tem a
--time-style
opção:Você pode comparar o carimbo de data/hora do arquivo com UNIX_TIMESTAMP(NOW()) .
Acho que encontrei a solução. Por algum tempo eu estava olhando para o Percona Server para substituir meus servidores MySQL, e agora acho que há uma boa razão para isso.
O servidor Percona introduz muitas novas tabelas INFORMATION_SCHEMA como INNODB_TABLE_STATS, que não está disponível no servidor MySQL padrão. Quando você faz:
Você obtém a contagem real de linhas e um contador. A documentação oficial diz o seguinte sobre este campo:
Portanto, esse contador é encapsulado de vez em quando, mas você pode fazer uma soma de verificação do número de linhas e do contador e, a cada modificação da tabela, você obtém uma soma de verificação exclusiva. Por exemplo:
Eu ia atualizar meus servidores para o servidor Percona de qualquer maneira, então esse limite não é um problema para mim. Gerenciar centenas de gatilhos e adicionar campos a tabelas é um grande problema para esse aplicativo, porque está muito atrasado no desenvolvimento.
Esta é a função PHP que criei para garantir que as tabelas possam ser somadas com qualquer mecanismo e servidor usado:
Você pode usar assim:
Espero que isso economize alguns problemas para outras pessoas com o mesmo problema.
Você deve atualizar para o Mysql v5.6+ nessa versão innodb também tem suporte para tabela de checksum. http://dev.mysql.com/doc/refman/5.6/en/checksum-table.html
fora isso, a solução ideal seria se o seu cliente não estivesse pesquisando os resultados constantemente, mas você enviasse dados novos e alterados quando e se estivessem disponíveis. Seria mais rápido e menos carga estaria no servidor. se você estiver usando gui baseado na web, você deve procurar no APE http://ape-project.org/ ou outros projetos semelhantes.
Se você estiver adicionando principalmente a uma tabela, você pode ligar AUTO_INCREMENT como uma medida de atualização.
Mas eu prefiro me referir a uma fonte externa como um contador no Memcached, que você incrementará toda vez que alterar algo no banco de dados.
Você pode tentar fazer o seguinte:
Isso retorna um número que aumenta a cada atualização da tabela, acompanhar isso permitirá detectar a alteração.
Nota importante: o valor é alterado imediatamente após um UPDATE, não após COMMIT. Portanto, você pode não ver as alterações se as modificações foram feitas dentro de outra transação que não foi concluída.
Esta resposta não tem nada a ver com versões ou tipos de banco de dados mysql, eu queria saber se as instruções de atualização estavam fazendo alterações E fazer isso no meu código php ..
Criei uma tabela fictícia com um registro e um campo que eu consultaria para obter o valor do current_timestamp do mysql.
Para a tabela de dados que está sendo atualizada, adicionei um campo timestamp e usei a opção mysql "ON UPDATE CURRENT_TIMESTAMP"
Comparado #1 e #2
Isso não funcionará 100% do tempo, mas para minha aplicação foi uma solução simples e ótima. Espero que isso ajude alguém
Caso você queira verificar se a
view
mudou, você pode verificar a alteração mais recente entre as tabelas envolvidas na visualização:Observe que pode haver alguns falsos positivos, por exemplo, no caso de uma coluna de uma tabela (incluída na exibição) ter sido atualizada sem que a própria coluna faça parte da exibição. Nesse caso, a exibição será exibida como atualizada na consulta acima.