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
- Colunas usadas com frequência em filtros (
WHERE) ou junções cujo perfil de dados muda com o tempo, comostatus, categorias ou faixas de data. - Tabelas sem índice na coluna filtrada, onde o histograma é a única fonte de estatística disponível para o otimizador decidir o plano.
- Ambientes onde ninguém lembraria de reagendar
ANALYZE TABLE ... UPDATE HISTOGRAMperiodicamente como tarefa manual de manutenção.
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.
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.
0 Comentário
Deixe seu Comentário!
Dúvida, sugestão ou só um "valeu!" — tudo é bem-vindo por aqui.