← Назад к вопросам

При построении индекса для большой таблицы, будет ли доступ к таблице во время этого процесса

2.0 Middle🔥 301 комментариев
#SOLID и паттерны проектирования#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Доступ к таблице при построении индекса

Краткий ответ

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

Поведение в основных СУБД

PostgreSQL

  • Команда CREATE INDEX по умолчанию использует ACCESS EXCLUSIVE lock, которая блокирует все операции (чтение и запись) на таблице до завершения индексирования
  • Для избежания блокировки используется опция CONCURRENTLY: CREATE INDEX CONCURRENTLY idx_name ON table_name(column)
  • При использовании CONCURRENTLY таблица остается полностью доступной, но процесс индексирования занимает больше времени

MySQL/InnoDB

  • Операция зависит от алгоритма: ALGORITHM=COPY требует полного блокирования
  • ALGORITHM=INPLACE позволяет параллельные DML операции (в зависимости от версии MySQL)
  • LOCK=NONE разрешает одновременное чтение и запись
  • Синтаксис: ALTER TABLE table_name ADD INDEX idx_name (column), ALGORITHM=INPLACE, LOCK=NONE

Oracle Database

  • CREATE INDEX по умолчанию не блокирует таблицу для чтения
  • Запись может быть заблокирована в зависимости от фазы построения индекса
  • Используется режим ONLINE: CREATE INDEX idx_name ON table_name(column) ONLINE

Практические рекомендации

Для уменьшения влияния на производство:

  1. Выполняйте индексирование во внеурочное время — когда нагрузка на БД минимальна
  2. Используйте параллельное индексирование — где доступно (CONCURRENTLY в PostgreSQL, ONLINE в Oracle)
  3. Проверяйте текущие блокировки — перед началом операции убедитесь, что нет активных транзакций
  4. Разбивайте большие таблицы — индексируйте по частям, если это возможно
  5. Мониторьте процесс — используйте системные представления для отслеживания хода индексирования

Пример на Java (использование liquibase для миграций)

// liquibase migration XML
<changeSet id="create_index_concurrently" author="dev">
    <sql dbms="postgresql">
        CREATE INDEX CONCURRENTLY idx_users_email ON users(email);
    </sql>
</changeSet>

Заключение

До начала построения индекса всегда уточняйте:

  • Версию СУБД и её поведение при индексировании
  • Размер таблицы и ожидаемое время индексирования
  • SLA приложения по доступности
  • Наличие инструментов для параллельного индексирования

Выбор между доступностью и скоростью индексирования — критическое решение, которое должно приниматься на основе бизнес-требований.

При построении индекса для большой таблицы, будет ли доступ к таблице во время этого процесса | PrepBro