Есть ли
ALTER TABLE sample ADD COLUMN `hasItem` tinyint(1) DEFAULT NULL
заблокировать всю таблицу?
Есть ли
ALTER TABLE sample ADD COLUMN `hasItem` tinyint(1) DEFAULT NULL
заблокировать всю таблицу?
Короткий ответ: для MySQL < 5.6 замки необходимы. Начиная с 5.6 по, и используя InnoDB, блокировки не требуются для многих операций ALTER TABLE
, включая добавление столбца.
Если вы используете MySQL 5.5 или старше, он получит блокировку чтения для всей операции, а затем короткую блокировку записи в конце.
Из документации MySQL для ALTER TABLE...
В большинстве случаев ALTER TABLE создает временную копию исходной таблицы... Пока выполняется ALTER TABLE, исходная таблица может быть прочитана другими сеансами (с отмеченным исключением). Обновления и записи в таблицу, которые начинаются после начала операции ALTER TABLE, останавливаются до тех пор, пока новая таблица не будет готова...
Исключение, упомянутое ранее, заключается в том, что ALTER TABLE блокирует чтение (а не только запись) в том месте, где он готов установить новую версию файла таблицы .frm, отбросить старый файл и очистить устаревшие структуры таблиц из кеш-таблицы и таблицы. На этом этапе он должен получить эксклюзивный замок.
То есть, добавляя столбец, который он считывает, блокирует таблицу для большей части операции, а затем получает блокировку записи в конце.
MySQL 5.6 добавил Online DDL в InnoDB, который ускоряет и улучшает многие вещи, такие как изменение таблиц и индексов. Добавление столбца в таблицу больше не потребует блокировок таблиц кроме кратких эксклюзивных блокировок в начале и в конце операции.
Это должно произойти автоматически, но обязательно установите ALGORITHM=inplace
и LOCK=none
в оператор ALTER TABLE
.
Есть одно исключение...
Таблицы InnoDB, созданные до того, как MySQL 5.6 не поддерживают ALTER TABLE... ALGORITHM = INPLACE для таблиц, содержащих временные столбцы (DATE, DATETIME или TIMESTAMP) и не были восстановлены с использованием ALTER TABLE... ALGORITHM = COPY.