Depuis que MySQL 5.6 a introduit DDL en ligne, la ALTER TABLE
commande peut éventuellement avoir soit ALGORITHM=INPLACE
ou ALGORITHM=COPY
spécifié. La vue d'ensemble du DDL en ligne note que, par défaut, INPLACE
est utilisé dans la mesure du possible, et implique (sans jamais le dire tout à fait) que l' INPLACE
algorithme est moins cher que COPY
celui.
Alors, quelle raison aurais-je à préciser ALGORITHM=COPY
sur une ALTER TABLE
déclaration?
mysql
alter-table
ddl
online-operations
Mark Amery
la source
la source
OPTIMIZE TABLE
de propos car (qui je crois a des index de défragmentation comme une grande partie de son objectif ) utilise àALGORITHM=INPLACE
partir de MySQL 5.7.4. Je pense donc qu'il est vrai que, oui,COPY
ne indices defrag, mais le faitINPLACE
( en quelque sorte), réduire à néant comme un avantage potentielCOPY
.ALTER TABLE ... ALGORITHM=INPLACE
tables qui incluent des colonnes temporelles (DATE, DATETIME ou TIMESTAMP) et n'ont pas été reconstruites à l'aide deALTER TABLE ... ALGORITHM=COPY
" ... Limitations de Online DDLRéponses:
Oui, il y a des cas où vous pouvez le préciser
COPY
, mais ce serait pour d'autres raisons que les performances.Il est important de comprendre que MySQL a introduit une nouvelle fonctionnalité - le traitement des DLL en ligne dans la version 5.6. Il n'a pas supprimé le traitement hors ligne. Il faut donc différencier ces 2 modes:
Certaines opérations ne fonctionnent toujours qu'en mode hors ligne. Voir Tableau 15.10, « Résumé de l'état en ligne des opérations DDL » pour une liste des opérations DDL qui peuvent ou ne peuvent pas être effectuées sur place.
Les opérations dans les modes En ligne et Hors ligne ont un comportement légèrement différent, vous pouvez donc en choisir un "ancien" pour des raisons de compatibilité.
Quelques exemples (veuillez en suggérer plus):
Les tables InnoDB créées avant MySQL 5.6 ne prennent pas en charge les
ALTER TABLE ... ALGORITHM=INPLACE
tables qui incluent des colonnes temporelles (DATE
,DATETIME
ouTIMESTAMP
) et qui n'ont pas été reconstruites à l'aideALTER TABLE ... ALGORITHM=COPY
. Dans ce cas, uneALTER TABLE ... ALGORITHM=INPLACE
opération renvoie une erreur.ADD PRIMARY KEY
La clause inCOPY mode
convertit silencieusement lesNULL
valeurs par défaut pour ce type de données (0 pour INT, chaîne vide pour varchar), alorsIN_PLACE
qu'elle ne le fait pas.Une autre raison de préférer
COPY
:Bien que le manuel MySQL ne parle pas de scénarios réels, vous pouvez en imaginer certains. Par exemple, le développeur s'est appuyé sur le verrouillage de la table pendant l'
ALTER INDEX
opération, la table est donc en lecture seule ou entièrement verrouillée et il existe un processus qui lit la table statique pendant la reconstruction de l'index.la source
ALGORITHM=INPLACE
avec "ceci est DDL en ligne et ne verrouillera pas la base de données", alors qu'en fait, ils veulent réellement utiliserLOCK=NONE
.@Stoleg a probablement la meilleure réponse, mais en voici une autre. C'est une supposition éclairée que les développeurs ont laissé
=COPY
comme une trappe d'échappement au cas où il y aurait un bug sérieux=INLINE
. Cela permettrait aux utilisateurs de continuer à utiliserALTER
même si la nouvelle fonctionnalité est interrompue.J'ai vu des choses comme ça (dans les drapeaux
sql_mode
, lesmy.cnf
paramètres, etc.) au fil des ans. L'intention de la nouvelle version est clairement de faire ressortir la nouvelle fonctionnalité, meilleure.Les drapeaux d'optimisation entrent dans cette catégorie, mais il y a encore plus de raisons de s'accrocher aux actions précédentes - l'Optimizer «fera toujours mal» parfois; il y a tout simplement trop de possibilités.
la source
Dans les versions de MySQL qui prennent en charge le chiffrement de l'espace de table InnoDB, lorsque vous modifiez une table pour ajouter un chiffrement, la modification est effectuée en utilisant l'algorithme de copie par nécessité.
la source