В каких случаях созданный индекс, скорее всего, не будет использован?
- Почему база не использует мой индекс?
Индекс не используется, когда: функция или приведение типа над колонкой, LIKE '%…' с ведущим шаблоном, низкая селективность (выбирается большая доля строк), запрос не по левому префиксу составного индекса, устаревшая статистика.
WHERE lower(email) = ?— функциональный индексON (lower(email))LIKE '%abc%'— триграммный индекс (pg_trgm) или полнотекстовый поиск- Несовпадение типов параметра и колонки ломает индекс
А ещё Иногда полный просмотр действительно быстрее — оптимизатор прав
Подробно
B-tree упорядочен по значению колонки, поэтому любое преобразование этого значения разрушает порядок — лечится функциональным индексом по тому же выражению. Ведущий '%' не даёт зафиксировать префикс, и для такого поиска нужен триграммный или полнотекстовый индекс. Низкая селективность — случай, когда планировщик сознательно предпочитает последовательное чтение: сходить в индекс, а затем за каждой строкой в таблицу дороже, чем прочитать её подряд. Сюда же относится неявное приведение типов, когда колонка и параметр разного типа.
Что хотят услышать
- Перечень причин с примерами.
- Как исправить каждую.
- Что Seq Scan не всегда ошибка.
Частые ошибки
- Считать неиспользование индекса ошибкой планировщика — часто это верное решение.
- Забывать про неявное приведение типов как причину.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Точное равенство по индексированной колонке с высокой селективностью условия
- ✓Колонка обёрнута функцией: lower(email) = ? при обычном индексе по email
- ✓LIKE с ведущим шаблоном: name LIKE '%иванов'
- ✓Условие отбирает большую часть таблицы
Что спросят дальше
- Что такое функциональный индекс?
- Почему covering index избавляет от обращения к таблице?
Разбор темы
- Индексы и планы запросов
Устройство B-tree, hash vs B-tree, составной и covering индекс, цена записи и когда индекс не используется.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.