Будет ли таблица доступна для операций во время создания индекса в СУБД?

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

Ответ

Доступность таблицы во время создания индекса зависит от типа операции и конкретной СУБД.

Общий принцип:

  • Операции чтения (SELECT) обычно разрешены.
  • Операции записи (INSERT, UPDATE, DELETE) часто блокируются или сильно замедляются, так как СУБД должна обеспечить целостность нового индекса.

Специфика по СУБД:

  1. PostgreSQL: По умолчанию CREATE INDEX блокирует запись в таблицу. Для избежания блокировок используйте CREATE INDEX CONCURRENTLY.

    CREATE INDEX CONCURRENTLY idx_user_email ON users(email);

    Этот метод работает дольше, но не блокирует конкурентные операции записи.

  2. MySQL (InnoDB): Современные версии InnoDB используют алгоритм, позволяющий выполнять CREATE INDEX или ALTER TABLE ... ADD INDEX онлайн (с минимальной блокировкой). Таблица остается доступной для чтения и записи, но финальная фаза операции требует кратковременной эксклюзивной блокировки.

    ALTER TABLE orders ADD INDEX idx_created_at (created_at), ALGORITHM=INPLACE, LOCK=NONE;
  3. Рекомендации:

    • Создавайте индексы на больших таблицах в период низкой нагрузки.
    • Используйте онлайн-методы (CONCURRENTLY в PostgreSQL, ALGORITHM=INPLACE, LOCK=NONE в MySQL), если они поддерживаются.
    • Планируйте операции: для очень больших таблиц создание индекса может занять часы.