Что такое индексы и для чего их используют?
Индекс — вспомогательная структура данных в базе, которая ускоряет поиск записей по значениям определённых столбцов за счёт дополнительного расхода дискового пространства и замедления операций записи.
Аналогия из жизни: индекс — это как алфавитный указатель в конце книги. Вместо последовательного пролистывания 500 страниц, вы находите нужное слово в указателе и переходите сразу на нужную страницу.
Как работает индекс
Без индекса СУБД выполняет полное сканирование таблицы (Sequential Scan / Full Table Scan), проверяя каждую строку. С индексом СУБД использует структуру (обычно B-tree), чтобы за O(log N) найти нужные строки.
Преимущества
- Ускорение поиска (WHERE), сортировки (ORDER BY) и соединения (JOIN)
- Обеспечение уникальности данных (UNIQUE INDEX)
- Ускорение работы с диапазонами (BETWEEN, >, <)
Недостатки
- Дополнительное дисковое пространство (индекс может быть соизмерим с самой таблицей)
- Замедление операций INSERT, UPDATE, DELETE (при каждой модификации данных обновляется и индекс)
- Необходимость обслуживания (REINDEX, VACUUM в PostgreSQL)
Когда индексы полезны
- Столбцы, часто используемые в WHERE и JOIN
- Столбцы с высокой кардинальностью (много уникальных значений)
- Столбцы, по которым выполняется сортировка
- Первичный ключ (индекс создаётся автоматически)
Когда индексы бесполезны или вредны
- Маленькие таблицы (полное сканирование быстрее)
- Столбцы с низкой кардинальностью (пол, статус true/false)
- Столбцы, которые редко используются в запросах
- Таблицы с интенсивной записью и редким чтением
На собеседовании: интервьюер хочет услышать про компромисс: индекс ускоряет чтение, но замедляет запись и занимает место. Частая ошибка — забыть про стоимость поддержания индексов при INSERT/UPDATE и считать, что индексы нужно создавать на все столбцы.