Сначала ответь вслух
Скажи ответ вслух хотя бы пару минут, потом открой эталон и сравни. Эталон открыт всем и не требует входа.
Показать ответ
Эталонный ответ
PostgreSQL оценивает стоимость планов по статистике и выбирает дешёвый. Индекс — не приказ, а одна из возможностей.
- Условие выбирает большую долю таблицы: последовательное чтение дешевле случайных обращений.
- Над столбцом функция:
WHERE lower(email) = ...не использует индекс поemail. Нужен индекс по выражению. - Тип параметра не совпадает с типом столбца, и приведение идёт со стороны столбца.
LIKE '%abc'с ведущим процентом B-дерево не ускорит.- Составной индекс
(a, b), а условие только поb. - Устаревшая статистика: оценка строк сильно расходится с фактом. Помогает
ANALYZE.
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM orders WHERE lower(email) = 'a@example.com';
CREATE INDEX orders_email_lower ON orders (lower(email));Как у тебя получилось?
Уточняющие вопросы
Так обычно копают глубже. Раскрой строку, когда ответишь вслух.
Уточнение 1-го уровня: Как читать EXPLAIN ANALYZE?
Ответ уровня Middle
Сравнить оценку строк с фактическими rows, найти узел, где ушло больше всего времени, и помнить, что время узла умножается на loops.
Уточнение 2-го уровня: Что такое покрывающий индекс?
Ответ уровня Senior
Индекс, в котором есть все нужные запросу столбцы, например через INCLUDE. Тогда возможен Index Only Scan без чтения таблицы, если страницы отмечены видимыми в карте видимости.
Типичные ошибки
- Добавлять индекс на каждый столбец «на всякий случай».
- Проверять план на пустой базе разработчика.
Первоисточники
Быстрые задания по теме
Для темы «Индексы и планы запросов» быстрых заданий пока нет
Можно проверить всю зону «SQL и транзакции» тестом на 10 минут.
Проверить себя за 10 минут