Какие типы индексов добавляли: составные или по отдельным полям
Что проверяют
Это вопрос про опыт: добавляли ли вы индексы сами и понимаете ли, почему выбрали именно такой. Интервьюер ждёт конкретный запрос, план выполнения и результат. Следом почти всегда спрашивают про порядок колонок и про то, как индекс выкатывали на живую таблицу.
Как отвечать
Стройте ответ от случая из своей практики:
- запрос: какой и откуда, например метод Spring Data
findByCustomerIdAndStatusOrderByCreatedAtDesc; - диагностика:
pg_stat_statements, лог медленных запросов,EXPLAIN (ANALYZE, BUFFERS)сSeq Scanпо большой таблице; - решение: для такого запроса подходит составной
(customer_id, status, created_at DESC). Сначала колонки с равенством, потом колонка диапазона или сортировки, и база отдаёт строки уже упорядоченными, без отдельногоSort; - выкатка: миграцией Liquibase или Flyway, а не
ddl-auto. В PostgreSQL черезCREATE INDEX CONCURRENTLY, чтобы не блокировать запись. Внутри транзакции эта команда не работает, поэтому миграцию помечают отдельно, в Liquibase этоrunInTransaction="false"; - результат: время запроса и план до и после. Цифры должны быть вашими.
Покажите, что знаете альтернативу: PostgreSQL умеет объединять два одиночных индекса через BitmapAnd, но обычно это медленнее одного составного. Одиночные индексы оправданы, когда колонки фильтруются независимо в разных запросах.
Аннотация @Index в @Table знает только колонки, порядок и уникальность: тип индекса, INCLUDE или условие частичного индекса через неё не задать.
Если такого опыта не было, скажите прямо и разберите, как бы действовали. Это лучше выдуманной истории, которая развалится на первом уточнении.
Где спотыкаются
Ставят колонки в случайном порядке. Индекс (created_at, customer_id) плохо помогает запросу по одному customer_id, потому что работает слева направо.
Держат одновременно (customer_id) и (customer_id, created_at). Первый дублирует префикс второго и только замедляет запись.
Рассказывают про ускорение без цифр и плана. Фраза «стало быстрее» без EXPLAIN звучит как пересказ статьи.