УРОК 23 / 27· ≈ 10 мин

Зачем нужны индексы

Как база находит строки быстро

Если подходящего индекса нет, для поиска по условию (WHERE airplane_code = '77W') база обычно читает таблицу целиком и проверяет строки — это называется последовательное сканирование (Seq Scan). На маленькой таблице это мгновенно, а на большой может быть дорого.

Индекс — это вспомогательная структура, которая позволяет находить строки по значению столбца, не перебирая всю таблицу. Представьте алфавитный указатель в конце учебника: вместо чтения всей книги вы открываете нужную страницу за пару движений.

Поиск по индексу B-tree

По умолчанию PostgreSQL строит индекс типа B-tree — сбалансированное дерево с логарифмической стоимостью навигации. Но итоговая стоимость включает чтение страниц таблицы, а для большого процента строк последовательное сканирование может оказаться выгоднее индекса.

CREATE INDEX idx_routes_airplane ON routes (airplane_code);

Какие бывают индексы

  • по одному столбцу — самый частый случай;
  • по нескольким столбцам: CREATE INDEX ... ON routes (departure_airport, arrival_airport);
  • уникальный: CREATE UNIQUE INDEX ... — заодно запрещает дубликаты;
  • по выражению: CREATE INDEX ... ON flights ((date(scheduled_departure))) — для поиска по вычисляемому значению;
  • частичный: ... WHERE status = 'Scheduled' — индексирует не всю таблицу, а часть.

За всё надо платить

⚠️ Индексы ускоряют чтение, но замедляют запись (INSERT/UPDATE/DELETE) и занимают место на диске — ведь их тоже нужно поддерживать в актуальном состоянии. Поэтому индексируют выборочно: столбцы, по которым часто идёт поиск (WHERE) и соединение (ON).

Как понять, помогает ли индекс

Команда EXPLAIN показывает план выполнения запроса — как именно база собирается его выполнять, а EXPLAIN ANALYZE ещё и реально выполняет, показывая время:

EXPLAIN ANALYZE
SELECT * FROM routes WHERE airplane_code = '77W';

В плане сравнивайте Seq Scan (читается таблица целиком) и Index Scan (используется индекс). Seq Scan не всегда плох: он нормален для маленькой таблицы или запроса, который возвращает значительную часть строк. Индекс особенно полезен для выборочных условий.

💡 Это обзорный урок: на нашей учебной базе индексы менять нельзя (она только для чтения), поэтому здесь — теория. Главное — понимать зачем индексы нужны и чем за них платят.

Практика

6
  1. Тест 1 — Что обычно означает Seq Scan в плане большого запроса?
  2. Тест 2 — Какой главный недостаток большого числа индексов на таблице?
  3. Тест 3 — Какой тип индекса PostgreSQL создаёт по умолчанию?
  4. Тест 4 — Какая команда покажет план запроса с реальным временем выполнения?
  5. Тест 5 — В плане запроса «… WHERE flight_id = 42» видно «Seq Scan on flights». Что это значит?
  6. Тест 6 — Поможет ли обычный B-tree индекс по model запросу «WHERE model LIKE '%neo%'»?

Задачи решаются прямо здесь, в браузере, на учебной базе — нужна только бесплатная регистрация, чтобы сохранялись ответы и прогресс.

Зарегистрироваться и решитьВойти
Подзапрос, CTE и представление: что выбратьСледующий урок: Транзакции и ACID