Sobes.tech
Назад к вопросам
Junior — Middle
56

При каких ситуациях время выполнения запроса увеличивается без использования индекса?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Время выполнения запроса без индекса растёт, когда базе приходится читать больше строк или целые таблицы. Это особенно заметно на больших объёмах данных, при фильтрации, сортировке, join'ах и поиске по неиндексированным полям. Также запросы замедляются, если условия не позволяют использовать индекс даже при его наличии.

Определение:

Индекс ускоряет поиск за счёт уменьшения числа проверяемых строк. Если индекс не используется, СУБД часто выполняет полный скан таблицы, то есть последовательно просматривает все записи. Поэтому время выполнения растёт пропорционально размеру данных и сложности операции.

Типичные ситуации, когда запрос становится медленнее без индекса:

  • фильтрация по полю без индекса;
  • сортировка большого набора данных;
  • соединение таблиц по неиндексированным колонкам;
  • поиск по частичному условию, которое не может использовать индекс эффективно;
  • применение функций к столбцу в WHERE, из-за чего условие может стать неиндексируемым;
  • низкая избирательность поля, когда даже при наличии индекса выгода мала.

Пример использования:

SELECT *
FROM Orders
WHERE CustomerEmail = 'user@example.com';

Если CustomerEmail не индексирован, база может просканировать всю таблицу Orders, чтобы найти подходящие строки. На небольшой таблице это незаметно, но на миллионах записей запрос начнёт выполняться существенно дольше.

Ещё один типичный пример — сортировка:

SELECT *
FROM Orders
ORDER BY CreatedAt DESC;

Если по CreatedAt нет подходящего индекса, СУБД может сначала прочитать много строк, а затем выполнить дополнительную сортировку.

Пояснение кода:

Код выше показывает два распространённых случая:

  1. В WHERE CustomerEmail = ... поиск идёт по колонке, по которой может не быть индекса.
  2. В ORDER BY CreatedAt DESC без индекса на поле сортировки базе нужно отдельно упорядочить данные.

Если условия затрагивают большое число строк, СУБД вынуждена:

  • прочитать больше данных с диска;
  • сравнить больше значений;
  • тратить ресурсы на сортировку и объединение результатов.

Именно это и увеличивает время ответа запроса.

Ключевые моменты:

  • Без индекса часто происходит полный скан таблицы.
  • Медленнее всего становятся запросы на больших объёмах данных.
  • Сильно влияют WHERE, ORDER BY, JOIN, GROUP BY.
  • Функции над полем в условии могут мешать использованию индекса.
  • Индекс не всегда полезен: если выборка возвращает слишком много строк, выгода может быть небольшой.
  • Для оценки нужно смотреть план выполнения запроса, а не только наличие индекса.