SQLLab
ИндексыСредний

INDEX (индекс)

Структура данных, ускоряющая поиск строк по значению колонки.

Синтаксис
CREATE INDEX [CONCURRENTLY] idx_name ON table (column);
CREATE INDEX ON table (col1, col2);  -- составной

Объяснение

Индекс — как оглавление книги: позволяет найти нужные строки без полного сканирования таблицы. По умолчанию PostgreSQL создаёт B-tree индексы. Каждый индекс: - Ускоряет SELECT с условием по этой колонке - Замедляет INSERT, UPDATE, DELETE (индекс нужно обновить) - Занимает дополнительное место на диске

Пример

-- Простой индекс
CREATE INDEX ON users (email);

-- Составной (порядок важен!)
CREATE INDEX ON orders (user_id, created_at DESC);

-- Частичный — только активные
CREATE INDEX ON users (email) WHERE is_active = true;

Анекдоты по теме

— Почему UUID медленнее INT как первичный ключ? — UUID случайный — вставки разбросаны по всему индексу. — INT последовательный — всегда в конец. — Насколько медленнее? — На больших таблицах B-tree страницы постоянно разбиваются. В разы медленнее INSERT. — Решение? — UUID v7 (упорядоченный по времени) или ULID — случайные, но монотонные.

Оптимизатор запросов говорит медленному подзапросу: — Ты почему такой тормоз? Подзапрос (ковыряя IN (SELECT ...)): — Я каждую строчку с каждой сравниваю. Зато честно. Оптимизатор: — Используй EXISTS. Подзапрос, помолчав: — Так я не знаю, существую ли я на самом деле после этого...

Индекс говорит таблице: — Милая, ты знаешь, я тебя ускоряю в 1000 раз! Таблица (тяжело вздыхая): — А я из-за тебя при каждой вставке торможу. Ты меня перестраиваешь. Мы в toxic relationship. Индекс: — Ничего, я кластерный. Без меня ты вообще куча мусора на диске.