Desde que o MySQL 5.6 introduziu o DDL online, o ALTER TABLE
comando pode ter opcionalmente ALGORITHM=INPLACE
ou ALGORITHM=COPY
especificado. A visão geral do DDL on-line observa que, por padrão, INPLACE
é usada sempre que possível e implica (sem nunca afirmar isso) que o INPLACE
algoritmo é mais barato que o COPY
outro.
Então, qual motivo eu precisaria especificar ALGORITHM=COPY
em uma ALTER TABLE
declaração?
mysql
alter-table
ddl
online-operations
Mark Amery
fonte
fonte
OPTIMIZE TABLE
que (que eu acredito que tenha desfragmentado os índices como grande parte de seu propósito ) useALGORITHM=INPLACE
no MySQL 5.7.4. Então eu acho que é o caso de que, sim,COPY
faz índices de desfragmentação, mas faz assimINPLACE
(de alguma forma), anulando-o como uma vantagem potencial deCOPY
.ALTER TABLE ... ALGORITHM=INPLACE
tabelas que incluem colunas temporais (DATE, DATETIME ou TIMESTAMP) e não foram reconstruídas usandoALTER TABLE ... ALGORITHM=COPY
" ... Limitações do DDL OnlineRespostas:
Sim, há casos em que você pode especificar
COPY
, mas seria por outros motivos que não o desempenho.É importante entender que o MySQL introduziu um novo recurso - o processamento de DLL online na versão 5.6. Não removeu o processamento offline. Portanto, é necessário diferenciar entre esses dois modos:
Algumas operações ainda funcionam apenas no modo offline. Consulte a Tabela 15.10, “ Resumo do status on-line para operações DDL ” para obter uma lista das operações DDL que podem ou não ser executadas no local.
As operações nos modos Online e Offline têm um comportamento ligeiramente diferente, portanto você pode escolher o "antigo" por motivos de compatibilidade.
Alguns exemplos (sugira mais):
As tabelas InnoDB criadas antes do MySQL 5.6 não suportam
ALTER TABLE ... ALGORITHM=INPLACE
tabelas que incluem colunas temporais (DATE
,DATETIME
ouTIMESTAMP
) e não foram reconstruídas usandoALTER TABLE ... ALGORITHM=COPY
. Nesse caso, umaALTER TABLE ... ALGORITHM=INPLACE
operação retorna erro.ADD PRIMARY KEY
A cláusula inCOPY mode
converte silenciosamenteNULL
em valores padrão para esse tipo de dados (0 para INT, sequência vazia para varchar), enquantoIN_PLACE
que não faz isso.Outro motivo para preferir
COPY
:Embora o manual do MySQL não fale sobre cenários reais, você pode imaginar alguns. Por exemplo, o desenvolvedor contou com o bloqueio da tabela durante a
ALTER INDEX
operação, para que a tabela seja somente leitura ou totalmente bloqueada e haja um processo que leia a tabela estática durante a reconstrução do índice.fonte
ALGORITHM=INPLACE
com "este é DDL on-line e não bloqueiam o banco de dados", quando na verdade elas realmente querem usarLOCK=NONE
.@Stoleg provavelmente tem a melhor resposta, mas aqui está outra. É um palpite educado que os desenvolvedores deixaram
=COPY
como uma saída de emergência, caso houvesse um bug sério=INLINE
. Isso permitiria que os usuários continuassem a usar,ALTER
mesmo que o novo recurso estivesse quebrado.Vi coisas assim (em sinalizadores
sql_mode
,my.cnf
configurações etc.) ao longo dos anos. A intenção do novo lançamento é claramente trazer à tona o novo e melhor recurso.Os sinalizadores de otimização se enquadram nessa categoria, mas há ainda mais motivos para se manter nas ações anteriores - o Otimizador sempre "faz errado" algumas vezes; existem simplesmente muitas possibilidades.
fonte
Nas versões do MySQL que oferecem suporte à criptografia de espaço de tabela InnoDB, quando você altera uma tabela para adicionar criptografia, a alteração é feita usando o algoritmo de cópia por necessidade.
fonte