В таблице records(id) создан обычный B-tree индекс по id. Почему следующий запрос не будет использовать индекс?

B-tree индекс работает эффективно только при прямом сравнении поля с константой или диапазоном, например id = 5 или id > 10.

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

Что ответить на собеседовании

Запрос select from records where id % 2 = 0 не будет использовать обычный B-tree индекс по полю id, потому что условие содержит выражение с оператором % (остаток от деления), которое преобразует значение поля перед сравнением.

Подробный разбор

Ответ с пояснениями

Условие

В таблице records(id) создан обычный B-tree индекс по id. Почему следующий запрос не будет использовать индекс?

select * from records where id % 2 = 0

  • Для id нужен индекс типа GIN
  • Индексы не работают с выражениями в WHERE
  • % — это операция сравнения, а не фильтрации
  • limit и offset обязательны для оптимизации с индексом
  • Запрос обращается к числовому полю, а не строковому

Ответ

Запрос select * from records where id % 2 = 0 не будет использовать обычный B-tree индекс по полю id, потому что условие содержит выражение с оператором % (остаток от деления), которое преобразует значение поля перед сравнением.

B-tree индекс работает эффективно только при прямом сравнении поля с константой или диапазоном, например id = 5 или id > 10. Когда в WHERE используется функция или выражение над индексируемым полем, индекс не может быть применён напрямую.

Правильный ответ: Индексы не работают с выражениями в WHERE.

Для таких случаев можно создавать функциональные индексы, например индекс по выражению (id % 2), если СУБД это поддерживает, или использовать другие типы индексов, но обычный B-tree индекс по id не поможет.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку