Desde que MySQL 5.6 introdujo DDL en línea, el ALTER TABLE
comando opcionalmente puede tener uno ALGORITHM=INPLACE
u otro ALGORITHM=COPY
. La descripción general de DDL en línea señala que, de forma predeterminada, INPLACE
se usa siempre que sea posible e implica (sin decirlo nunca) que el INPLACE
algoritmo es más barato que el anterior COPY
.
Entonces, ¿qué razón tendría que especificar ALGORITHM=COPY
en una ALTER TABLE
declaración?
mysql
alter-table
ddl
online-operations
Mark Amery
fuente
fuente
OPTIMIZE TABLE
que (creo que tiene índices de desfragmentación como una gran parte de su propósito ) se utiliza aALGORITHM=INPLACE
partir de MySQL 5.7.4. Así que creo que es el caso de que, sí,COPY
hace índices de desfragmentación, pero también lo haceINPLACE
(de alguna manera), anulando como una ventaja potencial deCOPY
.ALTER TABLE ... ALGORITHM=INPLACE
con las tablas que incluyen columnas temporales (DATE, DATETIME o TIMESTAMP) y no se han reconstruido usandoALTER TABLE ... ALGORITHM=COPY
" ... Limitaciones de DDL en líneaRespuestas:
Sí, hay casos en los que puede especificar
COPY
, pero sería por otras razones además del rendimiento.Es importante comprender que MySQL introdujo una nueva característica: el procesamiento de DLL en línea en la versión 5.6. No eliminó el procesamiento fuera de línea. Por lo tanto, es necesario diferenciar entre estos 2 modos:
Algunas operaciones siguen funcionando solo en modo sin conexión. Consulte la Tabla 15.10, “ Resumen del estado en línea para operaciones DDL ” para obtener una lista de las operaciones DDL que pueden o no pueden realizarse en el lugar.
Las operaciones en los modos en línea y fuera de línea tienen un comportamiento ligeramente diferente, por lo que puede elegir uno "antiguo" por razones de compatibilidad.
Algunos ejemplos (sugiera más):
Las tablas InnoDB creadas antes de MySQL 5.6 no son compatibles
ALTER TABLE ... ALGORITHM=INPLACE
con las tablas que incluyen columnas temporales (DATE
,DATETIME
oTIMESTAMP
) y no se han reconstruido utilizandoALTER TABLE ... ALGORITHM=COPY
. En este caso, unaALTER TABLE ... ALGORITHM=INPLACE
operación devuelve un error.ADD PRIMARY KEY
La cláusula inCOPY mode
convierte silenciosamenteNULL
a valores predeterminados para ese tipo de datos (0 para INT, cadena vacía para varchar), mientrasIN_PLACE
que no hace eso.Otra razón para preferir
COPY
:Aunque el manual de MySQL no habla sobre escenarios reales, puedes imaginar algunos. Por ejemplo, el desarrollador confió en que la tabla se bloqueó durante la
ALTER INDEX
operación, por lo que la tabla es de solo lectura o está completamente bloqueada y hay un proceso que lee la tabla estática durante la reconstrucción del índice.fuente
ALGORITHM=INPLACE
con "esto es DDL en línea y no bloqueará la base de datos", cuando de hecho, realmente quieren usarloLOCK=NONE
.@Stoleg probablemente tenga la mejor respuesta, pero aquí hay otra. Es una suposición educada que los desarrolladores dejaron
=COPY
como una escotilla de escape en caso de que hubiera un error grave=INLINE
. Esto permitiría a los usuarios continuar utilizandoALTER
incluso si la nueva característica está rota.He visto cosas como esta (en banderas
sql_mode
,my.cnf
configuraciones, etc.) a lo largo de los años. La intención del nuevo lanzamiento es claramente mostrar la nueva y mejor característica.Las banderas de optimización caen en esta categoría, pero hay aún más razones para aferrarse a las acciones anteriores: el Optimizador siempre "lo hará mal" a veces; Simplemente hay demasiadas posibilidades.
fuente
En las versiones de MySQL que admiten el cifrado de espacio de tabla InnoDB, cuando se modifica una tabla para agregar cifrado, la modificación se realiza utilizando el algoritmo de copia por necesidad.
fuente