Pourquoi préférerais-je jamais ALGORITHM = COPY à ALGORITHM = INPLACE?


16

Depuis que MySQL 5.6 a introduit DDL en ligne, la ALTER TABLEcommande peut éventuellement avoir soit ALGORITHM=INPLACEou ALGORITHM=COPYspécifié. La vue d'ensemble du DDL en ligne note que, par défaut, INPLACEest utilisé dans la mesure du possible, et implique (sans jamais le dire tout à fait) que l' INPLACEalgorithme est moins cher que COPYcelui.

Alors, quelle raison aurais-je à préciser ALGORITHM=COPYsur une ALTER TABLEdéclaration?


Si vous utilisez COPY, qu'advient-il des index sur la table? Vous retrouvez-vous avec des index défragmentés en raison de la création et du remplissage d'une nouvelle table?
Dave Poole

Si COPY se remplit à partir de zéro, bien que ce soit une option lente, la table résultante pourrait mieux fonctionner en raison des index défragmentés.
Dave Poole

@DavePoole Belle théorie, mais je soupçonne que c'est hors OPTIMIZE TABLEde propos car (qui je crois a des index de défragmentation comme une grande partie de son objectif ) utilise à ALGORITHM=INPLACEpartir 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 potentiel COPY.
Mark Amery

2
"Les tables InnoDB créées avant MySQL 5.6 ne prennent pas en charge les ALTER TABLE ... ALGORITHM=INPLACEtables qui incluent des colonnes temporelles (DATE, DATETIME ou TIMESTAMP) et n'ont pas été reconstruites à l'aide de ALTER TABLE ... ALGORITHM=COPY" ... Limitations de Online DDL
JSapkota

Réponses:


10

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:

  1. 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.

  2. 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):

  1. Les tables InnoDB créées avant MySQL 5.6 ne prennent pas en charge les ALTER TABLE ... ALGORITHM=INPLACEtables qui incluent des colonnes temporelles ( DATE, DATETIMEou TIMESTAMP) et qui n'ont pas été reconstruites à l'aide ALTER TABLE ... ALGORITHM=COPY. Dans ce cas, une ALTER TABLE ... ALGORITHM=INPLACEopération renvoie une erreur.

  2. ADD PRIMARY KEYLa clause in COPY modeconvertit silencieusement les NULLvaleurs par défaut pour ce type de données (0 pour INT, chaîne vide pour varchar), alors IN_PLACEqu'elle ne le fait pas.

Avec la clause ALGORITHM = COPY, l'opération réussit malgré la présence de valeurs NULL dans les colonnes de clé primaire; les données sont modifiées en silence, ce qui pourrait provoquer des problèmes.

Une autre raison de préférer COPY:

Opérations pour lesquelles vous spécifiez ALGORITHM = COPY ou old_alter_table = 1, pour forcer le comportement de copie de table si nécessaire pour une rétrocompatibilité précise dans des scénarios spécialisés.

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 INDEXopé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.


1
Je pense que les gens ont également tendance à confondre ALGORITHM=INPLACEavec "ceci est DDL en ligne et ne verrouillera pas la base de données", alors qu'en fait, ils veulent réellement utiliser LOCK=NONE.
Brendan Byrd

2

@Stoleg a probablement la meilleure réponse, mais en voici une autre. C'est une supposition éclairée que les développeurs ont laissé =COPYcomme une trappe d'échappement au cas où il y aurait un bug sérieux =INLINE. Cela permettrait aux utilisateurs de continuer à utiliser ALTERmême si la nouvelle fonctionnalité est interrompue.

J'ai vu des choses comme ça (dans les drapeaux sql_mode, les my.cnfparamè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.


1
Pourquoi l'appelleriez-vous "trappe d'échappement" plutôt que "compatibilité descendante"? Bien qu'il n'y ait peut-être pas beaucoup de différence;)
Stoleg

1
Je dirais «rétrocompatibilité» si j'avais besoin du même code pour fonctionner sur les deux versions. Mais alors je m'inquiéterais de savoir si la nouvelle syntaxe était reconnue par l'ancienne version.
Rick James

-1

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é.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.