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.