Индексы и виды индексов
Индекс — структура данных, которая ускоряет поиск по столбцу, как алфавитный указатель в конце книги — не листаешь все страницы подряд, а сразу находишь нужное место.
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-го слоя).