Короткий ответ
Индекс — это дополнительная структура данных (обычно B-tree), хранящая упорядоченные значения колонки(ок) со ссылками на строки, что позволяет находить нужные строки за O(log n) вместо полного перебора таблицы (Seq Scan).
Как это работает подробнее
Без индекса СУБД читает все строки таблицы (Sequential Scan), проверяя условие у каждой. Индекс позволяет быстро найти диапазон или точное значение через обход дерева и затем обратиться только к нужным строкам таблицы.
Пример кода
example.sql
CREATE INDEX idx_orders_user_id ON orders(user_id);
EXPLAIN SELECT * FROM orders WHERE user_id = 42;
-- До индекса: Seq Scan on orders
-- После индекса: Index Scan using idx_orders_user_id on ordersЧто использовать на практике
- Практика. Индексы ускоряют SELECT с фильтрацией/сортировкой/джойнами по индексируемой колонке, но замедляют INSERT/UPDATE/DELETE, так как индекс нужно поддерживать в актуальном состоянии; план выполнения проверяют через EXPLAIN.
Подводные камни
- Ошибка. Создают индекс «на всякий случай» на каждую колонку, не оценивая рост времени записи и объёма на диске; забывают, что индекс не всегда используется планировщиком при низкой избирательности условия.