Seit MySQL 5.6 die Online-DDL eingeführt hat, kann der ALTER TABLE
Befehl wahlweise eine ALGORITHM=INPLACE
oder ALGORITHM=COPY
mehrere Angaben enthalten. Die Übersicht über die Online - DDL stellt fest , dass in der Standardeinstellung INPLACE
ist , wo immer möglich verwendet und impliziert (ohne jemals ganz besagt es) , dass der INPLACE
Algorithmus ist billiger als das COPY
ist.
Welchen Grund müsste ich also jemals in ALGORITHM=COPY
einer ALTER TABLE
Erklärung angeben ?
mysql
alter-table
ddl
online-operations
Mark Amery
quelle
quelle
OPTIMIZE TABLE
(was meiner Meinung nach einen großen Teil des Zwecks der Defragmentierung von IndizesALGORITHM=INPLACE
ausmacht ) verwendet wird. Deshalb denke ich , ist es der Fall , dass, ja,COPY
tut defrag Indizes, aber so tutINPLACE
(irgendwie), es als potentieller Vorteil zunichte gemachtCOPY
.ALTER TABLE ... ALGORITHM=INPLACE
Tabellen mit temporären Spalten (DATE, DATETIME oder TIMESTAMP) und wurden nichtALTER TABLE ... ALGORITHM=COPY
" ... mit den Einschränkungen von Online DDLAntworten:
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:
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.
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):
InnoDB - Tabellen erstellt , bevor MySQL 5.6 unterstützen nicht
ALTER TABLE ... ALGORITHM=INPLACE
für Tabellen , die zeitlichen Spalten enthalten (DATE
,DATETIME
oderTIMESTAMP
) und habe mit nicht wieder aufgebautALTER TABLE ... ALGORITHM=COPY
. In diesem Fall gibt eineALTER TABLE ... ALGORITHM=INPLACE
Operation einen Fehler zurück.ADD PRIMARY KEY
Klausel inCOPY mode
konvertiert stillschweigendNULL
in Standardwerte für diesen Datentyp (0 für INT, leere Zeichenfolge für varchar), wohingegenIN_PLACE
dies nicht der Fall ist.Ein weiterer Grund zu bevorzugen
COPY
: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 INDEX
Betriebs gesperrt ist, sodass sie schreibgeschützt oder vollständig gesperrt ist und während der Indexwiederherstellung statische Tabellen gelesen werden.quelle
ALGORITHM=INPLACE
mit "Dies ist Online DDL und sperrt die Datenbank nicht", obwohl sie das eigentlich wollenLOCK=NONE
.@Stoleg hat wahrscheinlich die beste Antwort, aber hier ist eine andere. Es ist eine begründete Vermutung, die die Entwickler
=COPY
als Notausgang hinterlassen haben, falls ein schwerwiegender Fehler aufgetreten ist=INLINE
. Auf diese Weise können Benutzer auch dann weiterarbeiten,ALTER
wenn die neue Funktion nicht mehr funktioniert.Ich habe solche Dinge über die Jahre gesehen (in Flaggen
sql_mode
,my.cnf
Einstellungen 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.
quelle
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.
quelle