Ponieważ MySQL 5.6 wprowadził DDL online, ALTER TABLE
polecenie może opcjonalnie mieć jeden ALGORITHM=INPLACE
lub ALGORITHM=COPY
określony. Przegląd internetowych DDL zauważa, że domyślnie INPLACE
jest stosowany wszędzie tam, gdzie to możliwe, i sugeruje (nigdy dość podając ją), że INPLACE
algorytm jest tańszy niż COPY
się jest.
Jaki więc powód powinienem podać ALGORITHM=COPY
w ALTER TABLE
oświadczeniu?
mysql
alter-table
ddl
online-operations
Mark Amery
źródło
źródło
OPTIMIZE TABLE
(jak sądzę, ma defragmentujące indeksy jako dużą część jej celu ) używaALGORITHM=INPLACE
od MySQL 5.7.4. Więc myślę, że to przypadek, że tak,COPY
czy indeksy Defrag, ale tak robiINPLACE
(jakoś), znoszący ją jako potencjalną korzyśćCOPY
.ALTER TABLE ... ALGORITHM=INPLACE
tabel zawierających kolumny czasowe (DATA, DATETIME lub TIMESTAMP) i nie zostały odbudowane przy użyciuALTER TABLE ... ALGORITHM=COPY
” ... Ograniczenia DDL onlineOdpowiedzi:
Tak, zdarzają się przypadki, w których można określić
COPY
, ale dzieje się tak z innych powodów niż wydajność.Ważne jest, aby zrozumieć, że MySQL wprowadził nową funkcję - przetwarzanie DLL online w wersji 5.6. Nie usunęło przetwarzania offline. Dlatego należy rozróżnić te 2 tryby:
Niektóre operacje nadal działają tylko w trybie offline. Tabela 15.10, „ Podsumowanie statusu online operacji DDL ” zawiera listę operacji DDL, które można lub nie można wykonać na miejscu.
Operacje w trybie online i offline mają nieco inne zachowanie, więc możesz wybrać „stary” ze względu na kompatybilność.
Kilka przykładów (proszę sugerować więcej):
Tabele InnoDB utworzone przed MySQL 5.6 nie obsługują
ALTER TABLE ... ALGORITHM=INPLACE
tabel zawierających kolumny czasowe (DATE
,DATETIME
lubTIMESTAMP
) i nie zostały przebudowane przy użyciuALTER TABLE ... ALGORITHM=COPY
. W takim przypadkuALTER TABLE ... ALGORITHM=INPLACE
operacja zwraca błąd.ADD PRIMARY KEY
klauzula inCOPY mode
po cichu konwertujeNULL
na wartości domyślne dla tego typu danych (0 dla INT, pusty ciąg dla varchar), podczasIN_PLACE
gdy nie robi tego.Kolejny powód, aby preferować
COPY
:Chociaż instrukcja MySQL nie mówi o rzeczywistych scenariuszach, możesz sobie wyobrazić niektóre. Np. Programista polegał na zablokowaniu tabeli podczas
ALTER INDEX
pracy, więc tabela jest tylko do odczytu lub całkowicie zablokowana, a proces przeszukiwania tabeli statycznej odbywa się podczas przebudowy indeksu.źródło
ALGORITHM=INPLACE
z tym, że „jest to Online DDL i nie blokuje bazy danych”, podczas gdy tak naprawdę chcą z niego korzystaćLOCK=NONE
.@Stoleg ma prawdopodobnie najlepszą odpowiedź, ale tutaj jest inna. Zgaduje, że programiści pozostawili
=COPY
luk ratunkowy na wypadek poważnego błędu=INLINE
. Pozwoliłoby to użytkownikom nadal korzystać,ALTER
nawet jeśli nowa funkcja jest zepsuta.Przez lata widziałem takie rzeczy (flagi
sql_mode
,my.cnf
ustawienia itp.). Celem nowej wersji jest wyraźnie przedstawienie nowej, lepszej funkcji.Flagi optymalizacji należą do tej kategorii, ale istnieje jeszcze więcej powodów, aby trzymać się poprzednich działań - Optymalizator zawsze „zrobi to źle”; jest po prostu zbyt wiele możliwości.
źródło
W wersjach MySQL, które obsługują szyfrowanie obszaru tabel InnoDB, po zmianie tabeli w celu dodania szyfrowania zmiana jest wykonywana przy użyciu algorytmu kopiowania z konieczności.
źródło