2016-02-16 13 views

Odpowiedz

22

Krótka odpowiedź: w przypadku MySQL < wymagane są 5,6 zamki. Od 5,6 i używając InnoDB, locks are not required for many ALTER TABLE operations including adding a column.


Jeśli używasz MySQL 5.5 lub starszych, otrzyma blokadę odczytu dla całej operacji, a następnie krótką blokadę zapisu na końcu.

From the MySQL documentation for ALTER TABLE ...

W większości przypadków ALTER TABLE sprawia tymczasową kopię oryginalnej tabeli ... Podczas ALTER TABLE jest wykonywany, oryginalna tabela jest czytelny przez innych sesji (z krótkim wyjątkiem). Aktualizacje i zapisy do tabeli, które rozpoczynają się po rozpoczęciu operacji ALTER TABLE, są wstrzymywane do momentu, aż nowa tabela będzie gotowa ...

Wyjątkiem, o którym mowa wcześniej, jest to, że bloki ALTER TABLE odczytują (nie tylko zapisują) w miejscu, w którym jest gotowy do zainstalowania nowej wersji pliku .frm tabeli, odrzuć stary plik i wyczyść przestarzałe struktury tabel z buforów definicji tabel i tabel. W tym momencie musi nabyć wyłączny zamek.

Co oznacza, że ​​po dodaniu kolumny odczytuje ona blokadę dla większości operacji, a następnie blokuje zapis na końcu.


MySQL 5.6 dodaje Online DDL do InnoDB, która przyspiesza i poprawia wiele rzeczy, takich jak zmiany tabel i indeksów. Dodanie kolumny do tabeli nie będzie już wymagać blokad tabeli except brief exclusive locks at the start and end of the operation.

To powinny się automatycznie, ale mieć pewność, zestaw ALGORITHM=inplace i LOCK=none do wyciągu ALTER TABLE.

Istnieje jeden wyjątek ...

tabele InnoDB utworzone przed MySQL 5.6 nie obsługują alter table ... ALGORITHM = Ustalone dla tabel zawierających kolumny czasowe (data, DateTime lub timestamp) i nie mają został przebudowany przy użyciu ALTER TABLE ... ALGORYTM = KOPIUJ.

Powiązane problemy