Alterar uma tabela grande sempre foi um dos momentos mais tensos de operar um banco de dados: um ALTER TABLE tradicional costuma reescrever a tabela inteira, bloqueando gravações por minutos ou horas. Desde o MySQL 8.0.29, o algoritmo ALGORITHM=INSTANT passou a cobrir também ADD COLUMN e DROP COLUMN em qualquer posição da tabela: em vez de tocar nas linhas existentes, o MySQL só atualiza os metadados do dicionário de dados, e a operação termina em milissegundos, não importa o tamanho da tabela.
O problema do ALTER TABLE tradicional
Adicionar uma coluna no meio de uma tabela com milhões de linhas, do jeito clássico, exige reescrever cada linha em um novo arquivo:
-- Antes do 8.0.29, isso podia travar a tabela por muito tempo
ALTER TABLE pedidos ADD COLUMN cupom VARCHAR(20) AFTER cliente_id;
Quanto maior a tabela, mais tempo a operação levava e mais espaço em disco e I/O ela consumia, mesmo em bancos com suporte a online DDL, que já evitava bloquear leituras e escritas mas não evitava o trabalho de reescrita.
Como o INSTANT funciona
A partir do MySQL 8.0.29, ALGORITHM=INSTANT é o padrão para ADD COLUMN e DROP COLUMN — não é preciso nem pedir explicitamente:
ALTER TABLE pedidos ADD COLUMN cupom VARCHAR(20) AFTER cliente_id;
-- Equivalente, mas explícito
ALTER TABLE pedidos ADD COLUMN cupom VARCHAR(20) AFTER cliente_id, ALGORITHM=INSTANT;
O InnoDB não reescreve as linhas antigas: ele guarda, junto de cada linha, a informação de qual "versão" do layout da tabela ela pertence. Linhas gravadas antes da alteração continuam com o formato antigo, e o MySQL preenche a nova coluna com seu valor DEFAULT (ou NULL) na hora da leitura, de forma transparente para quem consulta a tabela.
DROP COLUMN também é instantâneo
O mesmo vale para remover colunas: o MySQL marca a coluna como removida nos metadados, sem reescrever as linhas existentes:
ALTER TABLE pedidos DROP COLUMN observacao_interna, ALGORITHM=INSTANT;
Isso é especialmente útil para "desfazer" uma migração de schema malfeita ou remover uma coluna legada de uma tabela enorme sem agendar uma janela de manutenção.
Combinando múltiplas alterações
Várias operações instantâneas podem ser feitas na mesma instrução, o que evita múltiplas passagens pela tabela:
ALTER TABLE pedidos
ADD COLUMN cupom VARCHAR(20) AFTER cliente_id,
ADD COLUMN canal_venda VARCHAR(30) AFTER cupom,
DROP COLUMN observacao_interna,
ALGORITHM=INSTANT;
Quando usar
- Evoluir o schema de tabelas grandes em produção sem travar gravações nem agendar janela de manutenção.
- Adicionar colunas de controle (flags, campos de auditoria, chaves estrangeiras opcionais) sem impacto perceptível.
- Remover colunas obsoletas rapidamente, como parte de uma limpeza de schema.
- Pipelines de migração automatizados (Flyway, Liquibase, migrations de framework), onde alterações instantâneas reduzem o tempo total do deploy.
Limite de 64 versões e o erro 4092
Cada ADD COLUMN ou DROP COLUMN instantâneo cria uma nova "versão de linha" na tabela, e o MySQL 8.0 permite no máximo 64 versões acumuladas (esse limite subiu para 255 a partir do MySQL 9.1). Ao atingir o limite, novas operações instantâneas passam a ser rejeitadas:
ERROR 4092 (HY000): Maximum row versions reached for table `test`.`pedidos`.
No more columns can be added or dropped instantly. Please use COPY/INPLACE.
É possível acompanhar quantas versões uma tabela já acumulou consultando o dicionário de dados:
SELECT NAME, TOTAL_ROW_VERSIONS
FROM INFORMATION_SCHEMA.INNODB_TABLES
WHERE NAME = 'meu_banco/pedidos';
Rodar OPTIMIZE TABLE (ou qualquer ALTER TABLE que force a reconstrução da tabela, como ALGORITHM=INPLACE ou ALGORITHM=COPY) reescreve a tabela por completo e zera esse contador:
OPTIMIZE TABLE pedidos;
Casos que caem para o modo tradicional
Nem toda alteração de coluna se qualifica como instantânea. O MySQL volta automaticamente para INPLACE ou COPY (mais lentos) quando a tabela usa ROW_FORMAT=COMPRESSED, quando a tabela tem um índice FULLTEXT, quando é uma tabela temporária, ou quando a alteração pedida não é apenas um ADD/DROP simples de coluna (como mudar o tipo de uma coluna existente). Se ALGORITHM=INSTANT for pedido explicitamente e não puder ser usado nesses casos, o MySQL rejeita a instrução com um erro em vez de silenciosamente cair para outro algoritmo.
Compatibilidade
ALGORITHM=INSTANT para adicionar coluna no fim da tabela existe desde o MySQL 8.0.12. A extensão para adicionar em qualquer posição e para remover colunas foi introduzida no MySQL 8.0.29 (abril de 2022), continua disponível no MySQL 8.4 LTS, e teve o limite de versões ampliado de 64 para 255 no MySQL 9.1.0 (outubro de 2024).
Conclusão
O ALGORITHM=INSTANT muda a forma de encarar migrações de schema em bancos grandes: alterações que antes exigiam planejamento cuidadoso e janelas de manutenção agora podem ser aplicadas em produção sem bloqueio perceptível. O ponto de atenção é o limite de versões acumuladas — vale monitorar tabelas que recebem muitas migrações ao longo do tempo e rodar uma reconstrução ocasional para resetar o contador.
0 Comentário
Deixe seu Comentário!
Dúvida, sugestão ou só um "valeu!" — tudo é bem-vindo por aqui.