StudyCode
Индекс — дополнительная структура (обычно B-tree), которая позволяет находить строки по значению колонки без перебора всей таблицы: поиск за O(log n) вместо O(n), как оглавление в книге. Без индекса WHERE email = ... на миллионе строк — это full scan всей таблицы. Цена индексов: они занимают место на диске и замедляют запись — каждый INSERT/UPDATE должен обновить все индексы таблицы, поэтому «проиндексировать всё» нельзя. Индексируют колонки из частых WHERE/JOIN/ORDER BY, а проверяют пользу через EXPLAIN: он покажет, использует ли запрос Index Scan или всё ещё Seq Scan.
-- Таблица на 1 000 000 пользователей
EXPLAIN SELECT * FROM users WHERE email = 'anya@mail.ru';
-- Seq Scan on users (cost=0.00..18334.00) ← перебор всей таблицы
CREATE INDEX idx_users_email ON users(email);
EXPLAIN SELECT * FROM users WHERE email = 'anya@mail.ru';
-- Index Scan using idx_users_email (cost=0.42..8.44) ← мгновенно
-- Цена: каждый INSERT теперь обновляет и таблицу, и индекс
-- Составной индекс — когда фильтруют по паре колонок сразу
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at);