Получить доступ

В каких случаях созданный индекс, скорее всего, не будет использован?

MiddleИндексы и планы запросовSQLPostgreSQL
Ещё спрашивают так:
  • Почему база не использует мой индекс?
Коротко

Индекс не используется, когда: функция или приведение типа над колонкой, LIKE '%…' с ведущим шаблоном, низкая селективность (выбирается большая доля строк), запрос не по левому префиксу составного индекса, устаревшая статистика.

  • WHERE lower(email) = ? — функциональный индекс ON (lower(email))
  • LIKE '%abc%' — триграммный индекс (pg_trgm) или полнотекстовый поиск
  • Несовпадение типов параметра и колонки ломает индекс

А ещё Иногда полный просмотр действительно быстрее — оптимизатор прав

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

B-tree упорядочен по значению колонки, поэтому любое преобразование этого значения разрушает порядок — лечится функциональным индексом по тому же выражению. Ведущий '%' не даёт зафиксировать префикс, и для такого поиска нужен триграммный или полнотекстовый индекс. Низкая селективность — случай, когда планировщик сознательно предпочитает последовательное чтение: сходить в индекс, а затем за каждой строкой в таблицу дороже, чем прочитать её подряд. Сюда же относится неявное приведение типов, когда колонка и параметр разного типа.

Что хотят услышать

  • Перечень причин с примерами.
  • Как исправить каждую.
  • Что Seq Scan не всегда ошибка.

Частые ошибки

  • Считать неиспользование индекса ошибкой планировщика — часто это верное решение.
  • Забывать про неявное приведение типов как причину.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Условие оборачивает колонку функцией: WHERE lower(email) = ? при обычном индексе по email
  • ✓LIKE с ведущим шаблоном: WHERE name LIKE '%иванов'
  • ✓Низкая селективность: условие отбирает большую часть таблицы
  • ✗Условие использует точное равенство по индексированной колонке

Что спросят дальше

  • Что такое функциональный индекс?
  • Почему covering index избавляет от обращения к таблице?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем