Приходилось ли добавлять индексы в таблицы с большим объемом данных без остановки сервиса
Что проверяют
Знаете ли вы, что обычная команда создания индекса блокирует запись в таблицу, и умеете ли выкатывать изменения схемы на живой системе. Это вопрос про эксплуатацию: одно неудачное действие на большой таблице кладёт сервис целиком.
Как отвечать
Назовите механизм своей базы. В PostgreSQL это CREATE INDEX CONCURRENTLY: он проходит таблицу дважды, работает заметно дольше обычного, зато не мешает чтению и записи. Оговорки называйте сразу: внутри транзакции такая команда не выполняется, а при неудаче остаётся нерабочий индекс, который надо снести через DROP INDEX CONCURRENTLY и создать заново.
В MySQL с InnoDB ту же роль играет онлайновый DDL, ALGORITHM=INPLACE, LOCK=NONE, а когда версия или тип изменения этого не позволяют, берут внешние инструменты вроде gh-ost или pt-online-schema-change: они копируют таблицу и догоняют её по журналу.
Отдельный пункт про миграции. Flyway и Liquibase по умолчанию оборачивают шаг в транзакцию, и для конкурентного создания это надо отключать явно. Заодно скажите, что приложение обязано пережить промежуточное состояние, когда индекса ещё нет.
Хорошо добавить, зачем вообще индекс: до создания смотрим план запроса, после проверяем, что планировщик его выбрал, и следим за размером и за влиянием на запись. Частичный индекс по условию, которое и так есть во всех запросах, часто получается в разы меньше полного.
Где спотыкаются
Создают индекс обычной командой на таблице в десятки миллионов строк. Пишущие запросы встают в очередь, пул соединений заканчивается, и падает не база, а приложение целиком.
Второе: конкурентное создание запускают из миграционного инструмента, не отключив транзакцию. Шаг падает с ошибкой, в истории миграций остаётся незакрытая запись, и выкатка встаёт до ручного вмешательства.
Третье: считают, что индекс всегда ускоряет. На колонке с двумя значениями планировщик всё равно пойдёт последовательным чтением, а каждый лишний индекс замедляет вставку и занимает диск. Решает замер по плану, а не список подсказок о недостающих индексах.