Карта / SQL / Индексы и виды индексов

Индексы и виды индексов

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

CREATE INDEX idx_users_email ON users(email);

SELECT * FROM users WHERE email = 'artur@mail.ru';   -- теперь быстро, не сканирует всю таблицу

Без индекса база делает полный перебор (full scan) — проверяет каждую строку по очереди. С индексом — находит нужные строки почти мгновенно, похоже на бинарный поиск (см. тему «Бинарный поиск»).

Копнуть глубже

Самый частый тип индекса — B-tree (сбалансированное дерево), даёт поиск за O(log n). PostgreSQL использует его по умолчанию для большинства случаев.

Цена индекса — не бесплатно. Индекс ускоряет SELECT, но замедляет INSERT/UPDATE/DELETE — при каждом изменении таблицы индекс тоже нужно обновить. К тому же индекс занимает дополнительное место на диске. Поэтому индексы создают только на столбцах, которые реально часто участвуют в WHERE/JOIN/ORDER BY, а не на всех подряд.

Составной индекс — индекс сразу по нескольким столбцам:

CREATE INDEX idx_users_city_age ON users(city, age);
-- ускорит запросы, где есть city, или city + age вместе
-- но НЕ ускорит запрос только по age (порядок столбцов важен)
🎤 Закрыл тему, если можешь объяснить:
• зачем нужен индекс и аналогию с алфавитным указателем;
• почему индекс не бесплатен и замедляет запись (если дошёл до 2-го слоя).