Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL não atualiza information_schema, a menos que eu execute manualmente ANALYZE TABLE `myTable`


P: Por que o MySQL não atualiza information_schema automaticamente e como posso corrigir esse comportamento?

R: O InnoDB mantém o valor de auto_increment na memória e não o mantém no disco.

Comportamento de consultas de metadados (por exemplo, SHOW TABLE STATUS ) é influenciado pela configuração de innodb_stats_on_metadata e innodb_stats_persistent variáveis.

https://dev.mysql.com/doc /refman/8.0/en/innodb-parameters.html#sysvar_innodb_stats_on_metadata

Forçar um ANALYZE sempre que consultamos metadados pode prejudicar o desempenho.

Além das configurações dessas variáveis, ou forçando a coleta de estatísticas executando manualmente o ANALYZE TABLE , não acho que haja uma "correção" para o problema.

(Acho que principalmente porque não acho que seja um problema que precise ser corrigido.)

Para obter o valor mais alto de uma coluna auto_increment em uma tabela, o padrão normativo é:
 SELECT MAX(`ai_col`) FROM `myschema`.`mytable`

O que me intriga é por que precisamos recuperar essa informação em particular. Para que vamos usá-lo?

Certamente, não vamos usar isso no código do aplicativo para determinar um valor que foi atribuído a uma linha que acabamos de inserir. Não há garantia de que o valor mais alto não seja de uma linha que foi inserida por alguma outra sessão. E temos LAST_INSERT_ID() mecanismo para recuperar o valor de uma linha que nossa sessão acabou de inserir.

Se formos com o ANALYZE TABLE para atualizar as estatísticas, ainda há um pequeno tempo entre isso e um SELECT subsequente ... outra sessão pode entrar em outro INSERT para que o valor que obtemos das estatísticas de coleta possa estar "desatualizado" no momento em que o recuperarmos.