Зачем нужны индексы
Как база находит строки быстро
Если подходящего индекса нет, для поиска по условию (WHERE airplane_code = '77W') база обычно читает таблицу целиком и проверяет строки — это называется последовательное сканирование (Seq Scan). На маленькой таблице это мгновенно, а на большой может быть дорого.
Индекс — это вспомогательная структура, которая позволяет находить строки по значению столбца, не перебирая всю таблицу. Представьте алфавитный указатель в конце учебника: вместо чтения всей книги вы открываете нужную страницу за пару движений.
По умолчанию 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 — Что обычно означает Seq Scan в плане большого запроса?
- Тест 2 — Какой главный недостаток большого числа индексов на таблице?
- Тест 3 — Какой тип индекса PostgreSQL создаёт по умолчанию?
- Тест 4 — Какая команда покажет план запроса с реальным временем выполнения?
- Тест 5 — В плане запроса «… WHERE flight_id = 42» видно «Seq Scan on flights». Что это значит?
- Тест 6 — Поможет ли обычный B-tree индекс по model запросу «WHERE model LIKE '%neo%'»?
Задачи решаются прямо здесь, в браузере, на учебной базе — нужна только бесплатная регистрация, чтобы сохранялись ответы и прогресс.