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.