Los cambios de esquema en tablas grandes pueden tardar horas si se utiliza el comando tradicional ADD COLUMN. Este proceso reconstruye toda la tabla, consume una cantidad considerable de recursos de E/S y memoria, y puede bloquear las cargas de trabajo DML simultáneas. Instant ADD COLUMN evita estos problemas porque solo modifica los metadatos del diccionario de datos. De esta forma, la operación se completa en segundos sin importar el tamaño de la tabla, no genera bloqueos y casi no consume recursos adicionales.
Funcionamiento
El comando tradicional ADD COLUMN (en modo COPY o INPLACE) reconstruye toda la tabla. En tablas grandes, este proceso puede tardar horas y bloquear las cargas de trabajo DML simultáneas.
Instant ADD COLUMN (modo INSTANT) solo modifica los metadatos del diccionario de datos. Los datos de la tabla nunca se alteran.
A continuación se resume la diferencia entre ambos métodos.
|
Traditional ADD COLUMN (COPY or INPLACE) |
Instant ADD COLUMN (INSTANT) |
|
|
Tiempo |
Requiere reconstruir toda la tabla. El tiempo aumenta según el tamaño de la tabla. |
Solo modifica los metadatos. Se completa en segundos. |
|
Uso de recursos |
Consume temporalmente grandes cantidades de recursos de E/S y memoria. |
Casi no utiliza recursos adicionales. |
|
Impacto en el negocio |
Puede bloquear las cargas de trabajo en línea durante transacciones prolongadas o bajo alta concurrencia. |
No bloquea las tablas ni interrumpe las operaciones. |
|
Tamaño de la tabla |
No es compatible con la adición rápida de columnas en tablas grandes. |
Funciona en tablas de cualquier tamaño. |
Requisitos previos
Antes de empezar, compruebe que su instancia cumple con alguno de los siguientes requisitos de versión. Si la versión secundaria del motor no los cumple, update the minor engine version.
MySQL 8.0: todas las versiones secundarias del motor son compatibles.
MySQL 5.7: la versión secundaria del motor debe ser 20250331 o posterior.
Limitaciones
Motor y tipo de tabla
Solo se admite el motor de almacenamiento InnoDB.
No son compatibles las tablas comprimidas, las tablas con índices de texto completo ni las tablas temporales.
Operaciones
No es posible combinar varias operaciones DDL en una sola instrucción. Por ejemplo, no se admite crear un índice al mismo tiempo que se agrega una columna.
Instancias de solo lectura
Si su instancia principal utiliza alta disponibilidad y tiene instancias de solo lectura asociadas, establezca el parámetro loose_innodb_instant_ddl_enabled en ON tanto en la instancia principal como en las de solo lectura. De lo contrario, la replicación podría detenerse en estas últimas.
Posición predeterminada de la columna
Versión de MySQL | Versión secundaria del motor | Posición predeterminada de la columna |
5.7 | 20250331 o posterior | La nueva columna se agrega como la última columna. |
8.0 | Anterior a 20230630 | La nueva columna se agrega como la última columna. |
20230630 o posterior | Es posible especificar la posición de la columna. |
Para MySQL 5.7 o MySQL 8.0 (versiones anteriores a 20230630), asegúrese de que la tabla no tenga ninguna clave primaria implícita. Consulte las preguntas frecuentes para obtener más información.
Habilitar Instant ADD COLUMN
En MySQL 8.0, Instant ADD COLUMN está habilitado de forma predeterminada. No se requiere ninguna configuración.
Para MySQL 5.7, habilite esta función mediante el parámetro loose_innodb_instant_ddl_enabled:
Vaya a la página RDS Instances. Seleccione la región donde se encuentra su instancia y haga clic en el identificador de la instancia de destino.
En el panel de navegación izquierdo, haga clic en Parameters.
-
En la pestaña Modifiable Parameters, busque
loose_innodb_instant_ddl_enabled. En la columna Running Value, establezca el valor en ON.NotaEste cambio surte efecto de inmediato. No es necesario reiniciar la instancia.
Haga clic en Apply Changes. En el cuadro de diálogo, seleccione cuándo desea que el cambio surta efecto y haga clic en OK.
Operaciones relacionadas
Usar Instant ADD COLUMN
Fuerce el modo INSTANT si especifica el algoritmo de manera explícita:
ALTER TABLE <table_name> ADD COLUMN <column_name> <data_type> <constraints>, ALGORITHM = INSTANT;
Permita que RDS seleccione el algoritmo automáticamente: RDS for MySQL elige el modo óptimo durante la ejecución. Si la tabla es compatible con INSTANT, se utilizará ese modo:
ALTER TABLE <table_name> ADD COLUMN <column_name> <data_type> <constraints>;
Reemplace los siguientes marcadores de posición con los valores reales:
|
Placeholder |
Description |
|
|
Nombre de la tabla de destino |
|
|
Nombre de la nueva columna |
|
|
Tipo de dato de la nueva columna, por ejemplo, |
|
|
Restricciones opcionales, por ejemplo, |
Consultar las tablas que usaron Instant ADD COLUMN
MySQL 5.7:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE INSTANT_COLS > 0;
MySQL 8.0 (versiones anteriores a 20230630):
SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE INSTANT_COLS > 0;
MySQL 8.0 (versión 20230630 o posterior):
SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE TOTAL_ROW_VERSIONS > 0;
Consultar las columnas agregadas con Instant ADD COLUMN
MySQL 5.7: esta versión agrega la tabla INNODB_SYS_INSTANT_COLUMNS a la base de datos 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: un valor de 1 en HAS_DEFAULT indica que la columna se agregó mediante 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>");
Preguntas frecuentes
P1: Mi instancia cumple con los requisitos de Instant ADD COLUMN, pero aparece este error al agregar una columna: Feature not supported: 1845 ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY/INPLACE.
R:
Causa: si una tabla no tiene clave primaria ni clave única, RDS for MySQL agrega una clave primaria implícita para mejorar la eficiencia de la replicación. De forma predeterminada, esta clave primaria implícita ocupa la última columna. Esto obliga a Instant ADD COLUMN a colocar la nueva columna en una posición específica. Sin embargo, MySQL 5.7 y MySQL 8.0 (versiones anteriores a 20230630) no admiten la colocación de columnas en posiciones específicas.
Solución: para MySQL 5.7 o MySQL 8.0 (versiones anteriores a 20230630), asegúrese de que la tabla no contenga ninguna clave primaria implícita.