Ответ
Доступность таблицы во время создания индекса зависит от типа операции и конкретной СУБД.
Общий принцип:
- Операции чтения (
SELECT) обычно разрешены. - Операции записи (
INSERT,UPDATE,DELETE) часто блокируются или сильно замедляются, так как СУБД должна обеспечить целостность нового индекса.
Специфика по СУБД:
-
PostgreSQL: По умолчанию
CREATE INDEXблокирует запись в таблицу. Для избежания блокировок используйтеCREATE INDEX CONCURRENTLY.CREATE INDEX CONCURRENTLY idx_user_email ON users(email);Этот метод работает дольше, но не блокирует конкурентные операции записи.
-
MySQL (InnoDB): Современные версии InnoDB используют алгоритм, позволяющий выполнять
CREATE INDEXилиALTER TABLE ... ADD INDEXонлайн (с минимальной блокировкой). Таблица остается доступной для чтения и записи, но финальная фаза операции требует кратковременной эксклюзивной блокировки.ALTER TABLE orders ADD INDEX idx_created_at (created_at), ALGORITHM=INPLACE, LOCK=NONE; -
Рекомендации:
- Создавайте индексы на больших таблицах в период низкой нагрузки.
- Используйте онлайн-методы (
CONCURRENTLYв PostgreSQL,ALGORITHM=INPLACE, LOCK=NONEв MySQL), если они поддерживаются. - Планируйте операции: для очень больших таблиц создание индекса может занять часы.