Какие последствия может иметь добавление индекса к большой таблице (миллионы записей)?

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

Ответ

Создание индекса на большой таблице — ресурсоемкая операция, которая может повлиять на работу базы данных:

  • Блокировка таблицы: Многие СУБД по умолчанию используют эксклюзивную блокировку (EXCLUSIVE LOCK), которая блокирует операции INSERT, UPDATE, DELETE на время создания индекса.
  • Высокая нагрузка на систему: Процесс требует полного сканирования таблицы, сортировки данных и построения структуры индекса (B-дерева), что создает пиковую нагрузку на CPU, диск и память.
  • Увеличение размера базы данных: Индекс занимает дополнительное дисковое пространство (обычно 10-30% от размера данных таблицы).
  • Влияние на производительность записи: После создания каждый INSERT, UPDATE или DELETE должен также обновлять индекс, что добавляет небольшие накладные расходы.

Пример и рекомендации:

-- Стандартная операция (может заблокировать таблицу на долгое время)
CREATE INDEX idx_user_email ON large_users_table(email);

-- Рекомендуемые подходы для минимизации простоя:
-- PostgreSQL: Создание индекса без эксклюзивной блокировки
CREATE INDEX CONCURRENTLY idx_user_email ON large_users_table(email);

-- MySQL (InnoDB, версия 8.0+): Использование алгоритма inplace
ALTER TABLE large_users_table ADD INDEX idx_user_email (email), ALGORITHM=INPLACE, LOCK=NONE;

Практический совет: Выполняйте создание индексов на больших таблицах в период минимальной нагрузки (окно обслуживания), предварительно оценив необходимое дисковое пространство и время.