Ответ
Добавление столбца в крупную продакшен-таблицу требует осторожности, чтобы минимизировать время блокировки и влияние на производительность. Базовый синтаксис — ALTER TABLE ... ADD COLUMN, но стратегия зависит от СУБД.
Общая безопасная стратегия (MySQL/PostgreSQL):
- Добавляем столбец как NULLABLE без значения по умолчанию. Это самая быстрая операция (метаданные), которая не требует обновления каждой строки.
ALTER TABLE large_orders ADD COLUMN priority TINYINT NULL; - Постепенно заполняем данные фоновым заданием (batch-обновлением), чтобы не нагружать БД одним огромным запросом.
UPDATE large_orders SET priority = 1 WHERE id BETWEEN 1 AND 10000; -- Повторять, смещая диапазон, пока все строки не обновлены - После заполнения всех данных (опционально) добавляем
DEFAULTили меняем наNOT NULL.ALTER TABLE large_orders ALTER COLUMN priority SET DEFAULT 1; -- Или, если все строки заполнены: ALTER TABLE large_orders MODIFY COLUMN priority TINYINT NOT NULL DEFAULT 1;
Специфика СУБД:
- MySQL 8.0+ (с InnoDB): Используйте алгоритм
ALGORITHM=INPLACEи минимальную блокировкуLOCK=NONE(если операция поддерживается).ALTER TABLE large_orders ADD COLUMN priority TINYINT NULL, ALGORITHM=INPLACE, LOCK=NONE; - PostgreSQL: Операция
ADD COLUMNсDEFAULTзначением (кроме константыNULL) до версии 11 приводила к перезаписи таблицы. В современных версиях это оптимизировано. Лучше сначала добавить NULL-столбец, а потом задатьDEFAULTотдельной командой.
Главное правило: Все подобные операции выполняются в период низкой нагрузки, с предварительным тестированием на staging-окружении и под контролем мониторинга.