Alterações de esquema em tabelas grandes podem levar horas com o ADD COLUMN tradicional, que reconstrói a tabela inteira, consome grandes quantidades de I/O e memória e pode bloquear workloads de DML concorrentes. O Instant ADD COLUMN elimina esses problemas ao modificar apenas os metadados no dicionário de dados — concluindo em segundos para tabelas de qualquer tamanho, sem bloqueios e com quase nenhuma sobrecarga de recursos.
Como funciona
O ADD COLUMN tradicional (modo COPY ou INPLACE) reconstrói a tabela inteira. Em tabelas grandes, esse processo pode levar horas e bloquear workloads de DML concorrentes.
O Instant ADD COLUMN (modo INSTANT) modifica apenas os metadados no dicionário de dados. Os dados da tabela em si nunca são alterados.
A tabela a seguir resume as diferenças.
|
ADD COLUMN tradicional (COPY ou INPLACE) |
Instant ADD COLUMN (INSTANT) |
|
|
Tempo |
Exige reconstrução completa da tabela. O tempo aumenta proporcionalmente ao tamanho da tabela. |
Modifica apenas os metadados. Conclui em segundos. |
|
Uso de recursos |
Consome grandes quantidades de I/O e memória temporariamente. |
Utiliza praticamente nenhum recurso adicional. |
|
Impacto no negócio |
Pode bloquear workloads online durante transações de longa duração ou sob alta concorrência. |
Não bloqueia tabelas nem operações. |
|
Tamanho da tabela |
Tabelas grandes não são compatíveis com adição rápida de colunas. |
Funciona em tabelas de qualquer tamanho. |
Pré-requisitos
Antes de começar, verifique se sua instância atende a um dos seguintes requisitos de versão. Se a versão secundária do engine não atender aos requisitos, atualize a versão secundária do engine.
MySQL 8.0: todas as versões secundárias do engine são compatíveis.
MySQL 5.7: a versão secundária do engine deve ser 20250331 ou posterior.
Limitações
Engine e tipo de tabela
Apenas o storage engine InnoDB é compatível.
Tabelas compactadas, tabelas com índices full-text e tabelas temporárias não são compatíveis.
Operações
Não é possível combinar múltiplas operações DDL em um único statement. Por exemplo, criar um índice ao mesmo tempo que se adiciona uma coluna não é compatível.
Instâncias somente leitura
Se sua instância primária usa alta disponibilidade e tem instâncias somente leitura associadas, defina loose_innodb_instant_ddl_enabled como ON tanto na instância primária quanto nas instâncias somente leitura. Caso contrário, a replicação pode ser interrompida nas instâncias somente leitura.
Posição padrão da coluna
MySQL version | Minor engine version | Default column position |
5.7 | 20250331 ou posterior | A nova coluna é adicionada como a última coluna. |
8.0 | Anterior a 20230630 | A nova coluna é adicionada como a última coluna. |
20230630 ou posterior | A posição da coluna pode ser especificada. |
Para MySQL 5.7 ou MySQL 8.0 (anterior a 20230630), certifique-se de que não existe uma chave primária implícita na tabela. Consulte a seção de FAQ para mais detalhes.
Ativar o Instant ADD COLUMN
MySQL 8.0 tem o Instant ADD COLUMN ativado por padrão. Nenhuma configuração é necessária.
Para MySQL 5.7, ative o recurso definindo o parâmetro loose_innodb_instant_ddl_enabled:
Acesse a página RDS Instances. Selecione a região onde sua instância reside e clique no ID da instância de destino.
No painel de navegação à esquerda, clique em Parameters.
-
Na aba Modifiable Parameters, pesquise por
loose_innodb_instant_ddl_enabled. Na coluna Running Value, defina o valor como ON.NotaEssa alteração entra em vigor imediatamente. Nenhuma reinicialização é necessária.
Clique em Apply Changes. Na caixa de diálogo, selecione quando a alteração entra em vigor e clique em OK.
Operações relacionadas
Use Instant ADD COLUMN
Force o modo INSTANT especificando o algoritmo de forma explícita:
ALTER TABLE <table_name> ADD COLUMN <column_name> <data_type> <constraints>, ALGORITHM = INSTANT;
Deixe o RDS selecionar o algoritmo automaticamente — o RDS for MySQL escolhe o modo ideal em tempo de execução. Se o modo INSTANT for compatível com sua tabela, ele será utilizado:
ALTER TABLE <table_name> ADD COLUMN <column_name> <data_type> <constraints>;
Substitua os seguintes placeholders pelos valores reais:
|
Placeholder |
Descrição |
|
|
Nome da tabela de destino |
|
|
Nome da nova coluna |
|
|
Tipo de dados da nova coluna, por exemplo, |
|
|
Restrições opcionais, por exemplo, |
View tables that used Instant ADD COLUMN
MySQL 5.7:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE INSTANT_COLS > 0;
MySQL 8.0 (anterior a 20230630):
SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE INSTANT_COLS > 0;
MySQL 8.0 (20230630 ou posterior):
SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE TOTAL_ROW_VERSIONS > 0;
View columns added by Instant ADD COLUMN
MySQL 5.7 — o MySQL 5.7 adiciona a tabela INNODB_SYS_INSTANT_COLUMNS ao banco de dados INFORMATION_SCHEMA:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_INSTANT_COLUMNS WHERE TABLE_ID =
(SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME = "<database_name>/<table_name>");
MySQL 8.0 — um valor HAS_DEFAULT igual a 1 indica que a coluna foi adicionada usando o Instant ADD COLUMN:
SELECT * FROM INFORMATION_SCHEMA.INNODB_COLUMNS WHERE TABLE_ID =
(SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME = "<database_name>/<table_name>");
FAQ
P1: Minha instância atende aos requisitos para o Instant ADD COLUMN, mas recebo este erro ao adicionar uma coluna: Feature not supported: 1845 ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY/INPLACE.
R:
Causa: quando uma tabela não possui chave primária nem chave única, o RDS for MySQL adiciona uma chave primária implícita para melhorar a eficiência da replicação. Por padrão, essa chave primária implícita ocupa a última posição como coluna. Isso força o Instant ADD COLUMN a inserir a nova coluna em uma posição específica. Entretanto, o MySQL 5.7 e o MySQL 8.0 (anterior a 20230630) não oferecem suporte à inserção de colunas em posições específicas.
Solução: para MySQL 5.7 ou MySQL 8.0 (anterior a 20230630), certifique-se de que não existe uma chave primária implícita na tabela.