AUTO UPDATE: Histogramas que se Atualizam Sozinhos no MySQL 8.4

Como a opção AUTO UPDATE, adicionada no MySQL 8.4 LTS, faz os histogramas de coluna se recalcularem automaticamente junto com as estatísticas da tabela, sem depender de ANALYZE TABLE manual recorrente.

O otimizador do MySQL decide como executar uma consulta com base em estatísticas sobre a distribuição dos dados — e, desde o MySQL 8.0.19, parte dessas estatísticas pode vir de histogramas por coluna. O problema é que, até o MySQL 8.0, um histograma só era atualizado quando alguém rodava manualmente ANALYZE TABLE ... UPDATE HISTOGRAM de novo, e dados que mudam com o tempo acabavam deixando o otimizador trabalhar com uma distribuição desatualizada. O MySQL 8.4 LTS resolve isso com a opção AUTO UPDATE, que faz o histograma se atualizar sozinho sempre que as estatísticas da tabela são recalculadas.

Criando um histograma manual (o comportamento clássico)

Um histograma é criado ou atualizado com ANALYZE TABLE ... UPDATE HISTOGRAM ON coluna. Por padrão — e em qualquer versão anterior ao 8.4 — esse histograma é MANUAL UPDATE: ele fica congelado até que o mesmo comando seja executado de novo:

ANALYZE TABLE pedidos
    UPDATE HISTOGRAM ON status WITH 10 BUCKETS;

Esse histograma descreve a distribuição de valores da coluna status no momento em que o comando rodou. Se a proporção de pedidos 'pendente' versus 'concluido' mudar drasticamente nas semanas seguintes, o otimizador continua enxergando a distribuição antiga até alguém lembrar de rodar ANALYZE TABLE outra vez.

AUTO UPDATE: histogramas que se atualizam sozinhos

A partir do MySQL 8.4, basta trocar MANUAL UPDATE (o padrão implícito) por AUTO UPDATE na criação do histograma:

ANALYZE TABLE pedidos
    UPDATE HISTOGRAM ON status WITH 10 BUCKETS AUTO UPDATE;

Com essa opção marcada, o histograma passa a ser recalculado automaticamente toda vez que as estatísticas da tabela são atualizadas — seja por uma chamada explícita a ANALYZE TABLE pedidos (sem a cláusula HISTOGRAM), seja pelo recálculo automático e periódico que o InnoDB já faz em segundo plano para estatísticas persistentes. O número de buckets usado no recálculo automático é sempre o mesmo definido na criação do histograma — não é preciso repeti-lo.

Voltando para atualização manual

Para desligar a atualização automática de um histograma existente, basta recriar o histograma pedindo MANUAL UPDATE explicitamente:

ANALYZE TABLE pedidos
    UPDATE HISTOGRAM ON status WITH 10 BUCKETS MANUAL UPDATE;

A tabela INFORMATION_SCHEMA.COLUMN_STATISTICS guarda a definição completa do histograma, incluindo o modo de atualização, dentro do JSON da coluna HISTOGRAM:

SELECT SCHEMA_NAME, TABLE_NAME, COLUMN_NAME,
       JSON_EXTRACT(HISTOGRAM, '$."auto-update"') AS auto_update
FROM INFORMATION_SCHEMA.COLUMN_STATISTICS
WHERE TABLE_NAME = 'pedidos';

Removendo um histograma

Um histograma, automático ou manual, pode ser descartado com DROP HISTOGRAM, que não afeta as outras estatísticas da tabela:

ANALYZE TABLE pedidos DROP HISTOGRAM ON status;

Quando usar

Cuidados

AUTO UPDATE só dispara quando as estatísticas da tabela já estão sendo recalculadas por outro motivo — ele não cria um agendamento próprio nem consome recursos extras fora desses recálculos. Em tabelas InnoDB, isso depende das configurações usuais de estatísticas persistentes, como innodb_stats_auto_recalc. Também vale lembrar que o cache de estatísticas do otimizador tem um tempo de expiração controlado por information_schema_stats_expiry; para ver o histograma recém-recalculado refletido imediatamente em INFORMATION_SCHEMA, pode ser necessário zerar essa variável durante uma investigação.

Compatibilidade

Histogramas de coluna existem desde o MySQL 8.0.19 (2020), sempre com atualização manual. A opção AUTO UPDATE (e seu complemento explícito MANUAL UPDATE) na cláusula UPDATE HISTOGRAM foi adicionada no MySQL 8.4.0 LTS (abril de 2024) e segue disponível nas versões 9.x.

documentação oficial

Conclusão

O AUTO UPDATE tira dos ombros do time de operação a responsabilidade de lembrar de atualizar histogramas manualmente, reduzindo o risco de o otimizador tomar decisões de plano de execução com base em estatísticas antigas. Para colunas sem índice que mudam de distribuição com frequência, vale revisar os histogramas existentes e migrá-los para esse modo.

Tecnologia:
mysql

Deixe seu Comentário!

Dúvida, sugestão ou só um "valeu!" — tudo é bem-vindo por aqui.

Comentário
Nome
Email
lock Seu e-mail não será publicado.