Warum würde ich ALGORITHMUS = KOPIEREN dem ALGORITHMUS = INPLACE vorziehen?


16

Seit MySQL 5.6 die Online-DDL eingeführt hat, kann der ALTER TABLEBefehl wahlweise eine ALGORITHM=INPLACEoder ALGORITHM=COPYmehrere Angaben enthalten. Die Übersicht über die Online - DDL stellt fest , dass in der Standardeinstellung INPLACEist , wo immer möglich verwendet und impliziert (ohne jemals ganz besagt es) , dass der INPLACEAlgorithmus ist billiger als das COPYist.

Welchen Grund müsste ich also jemals in ALGORITHM=COPYeiner ALTER TABLEErklärung angeben ?


Wenn Sie COPY verwenden, was passiert mit den Indizes in der Tabelle? Haben Sie am Ende defragmentierte Indizes, weil eine neue Tabelle erstellt und von Grund auf neu erstellt wurde?
Dave Poole

Wenn COPY von Grund auf neu erstellt wird, kann die resultierende Tabelle aufgrund defragmentierter Indizes eine bessere Leistung erzielen, obwohl dies eine langsame Option ist.
Dave Poole

@ DavePoole Schöne Theorie, aber ich vermute, dass sie von der Marke abweicht, da sie ab MySQL 5.7.4 OPTIMIZE TABLE(was meiner Meinung nach einen großen Teil des Zwecks der Defragmentierung von Indizes ALGORITHM=INPLACEausmacht ) verwendet wird. Deshalb denke ich , ist es der Fall , dass, ja, COPY tut defrag Indizes, aber so tutINPLACE (irgendwie), es als potentieller Vorteil zunichte gemacht COPY.
Mark Amery

2
"InnoDB-Tabellen, die vor MySQL 5.6 erstellt wurden, unterstützen keine ALTER TABLE ... ALGORITHM=INPLACETabellen mit temporären Spalten (DATE, DATETIME oder TIMESTAMP) und wurden nicht ALTER TABLE ... ALGORITHM=COPY" ... mit den Einschränkungen von Online DDL
JSapkota vom

Antworten:


10

Ja, es gibt Fälle, in denen Sie möglicherweise angeben COPY, dies kann jedoch auch andere Gründe als die Leistung haben.

Es ist wichtig zu verstehen, dass MySQL eine neue Funktion eingeführt hat - die Online-DLL-Verarbeitung in Version 5.6. Die Offline-Verarbeitung wurde nicht entfernt. Man muss also zwischen diesen beiden Modi unterscheiden:

  1. Einige Vorgänge funktionieren nur noch im Offline-Modus. In Tabelle 15.10, „ Zusammenfassung des Online-Status für DDL-Vorgänge “ finden Sie eine Liste der DDL-Vorgänge, die direkt ausgeführt werden können oder nicht.

  2. Vorgänge im Online- und Offline-Modus weisen ein leicht unterschiedliches Verhalten auf. Sie können daher aus Kompatibilitätsgründen "alte" auswählen.

Einige Beispiele (bitte mehr vorschlagen):

  1. InnoDB - Tabellen erstellt , bevor MySQL 5.6 unterstützen nicht ALTER TABLE ... ALGORITHM=INPLACEfür Tabellen , die zeitlichen Spalten enthalten ( DATE, DATETIMEoder TIMESTAMP) und habe mit nicht wieder aufgebaut ALTER TABLE ... ALGORITHM=COPY. In diesem Fall gibt eine ALTER TABLE ... ALGORITHM=INPLACEOperation einen Fehler zurück.

  2. ADD PRIMARY KEYKlausel in COPY modekonvertiert stillschweigend NULLin Standardwerte für diesen Datentyp (0 für INT, leere Zeichenfolge für varchar), wohingegen IN_PLACEdies nicht der Fall ist.

Mit der Klausel ALGORITHM = COPY ist der Vorgang erfolgreich, obwohl in den Primärschlüsselspalten NULL-Werte vorhanden sind. Die Daten werden stillschweigend geändert, was zu Problemen führen kann.

Ein weiterer Grund zu bevorzugen COPY:

Operationen, für die Sie ALGORITHM = COPY oder old_alter_table = 1 angeben, um das Verhalten beim Kopieren von Tabellen zu erzwingen, falls dies für eine präzise Abwärtskompatibilität in speziellen Szenarien erforderlich ist.

Obwohl das MySQL-Handbuch nicht über tatsächliche Szenarien spricht, können Sie sich einige vorstellen. Der Entwickler hat sich beispielsweise darauf verlassen, dass die Tabelle während des ALTER INDEXBetriebs gesperrt ist, sodass sie schreibgeschützt oder vollständig gesperrt ist und während der Indexwiederherstellung statische Tabellen gelesen werden.


1
Ich denke, die Leute neigen auch dazu zu verwechseln ALGORITHM=INPLACEmit "Dies ist Online DDL und sperrt die Datenbank nicht", obwohl sie das eigentlich wollen LOCK=NONE.
Brendan Byrd

2

@Stoleg hat wahrscheinlich die beste Antwort, aber hier ist eine andere. Es ist eine begründete Vermutung, die die Entwickler =COPYals Notausgang hinterlassen haben, falls ein schwerwiegender Fehler aufgetreten ist =INLINE. Auf diese Weise können Benutzer auch dann weiterarbeiten, ALTERwenn die neue Funktion nicht mehr funktioniert.

Ich habe solche Dinge über die Jahre gesehen (in Flaggen sql_mode, my.cnfEinstellungen usw.). Die Absicht der neuen Version ist eindeutig, die neue, bessere Funktion herauszubringen.

Optimierungsflags fallen in diese Kategorie, aber es gibt noch mehr Gründe, die vorherigen Aktionen beizubehalten - der Optimierer wird es manchmal immer "falsch machen"; es gibt einfach zu viele möglichkeiten.


1
Warum würden Sie es "Escape-Luke" anstatt "Abwärtskompatibilität" nennen? Obwohl es nicht viel Unterschied geben kann;)
Stoleg

1
Ich würde "Abwärtskompatibilität" sagen, wenn ich für beide Versionen den gleichen Code benötige. Aber dann würde ich mir Sorgen machen, ob die neue Syntax von der alten Version erkannt wurde.
Rick James

-1

Wenn Sie in MySQL-Versionen, die die InnoDB-Tablespace-Verschlüsselung unterstützen, eine Tabelle ändern, um sie zu verschlüsseln, erfolgt die Änderung aus Bedarf mithilfe des Kopieralgorithmus.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.