Как добавить индекс на колонку большой таблицы, не залочив таблицу

«Как добавить индекс на колонку большой таблицы, не залочив таблицу» — вопрос из категории Базы данных, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для добавления индекса без блокировки таблицы в PostgreSQL можно использовать CONCURRENTLY:

CREATE INDEX CONCURRENTLY idx_name ON table_name(column_name);

Особенности:

  • Индекс строится в фоне, не блокируя запись
  • Занимает больше времени и ресурсов
  • При неудаче оставляет недействительный индекс (требуется удалить вручную)
  • Не поддерживается в транзакциях

В MySQL/InnoDB аналогично работает ALGORITHM=INPLACE:

ALTER TABLE table_name 
ADD INDEX idx_name (column_name) ALGORITHM=INPLACE, LOCK=NONE;