Зачем нужен индекс?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Зачем нужен индекс?
Индекс — это структура данных в БД, которая значительно ускоряет поиск и сортировку данных. Без индекса СУБД вынуждена выполнять полное сканирование таблицы (Full Table Scan), проверяя каждую строку. С индексом данные организованы так, что поиск становится намного быстрее.
Основные причины использования индексов
1. Ускорение поиска данных
Без индекса для поиска записи по условию WHERE нужно проверить все строки:
SELECT * FROM users WHERE email = "user@example.com";
-- Без индекса: O(n) — проверяет все 1 млн строк
С индексом на поле email:
CREATE INDEX idx_users_email ON users(email);
-- С индексом: O(log n) — логарифмическая сложность
2. Оптимизация JOIN операций
При объединении таблиц индекс на внешний ключ критичен:
-- Медленно без индекса
SELECT users.name, orders.total
FROM users
JOIN orders ON users.id = orders.user_id;
-- Быстро с индексом на orders.user_id
CREATE INDEX idx_orders_user_id ON orders(user_id);
3. Оптимизация сортировки и группировки
Индекс ускоряет ORDER BY и GROUP BY:
-- Без индекса выполняется дорогое сортирование
SELECT * FROM products ORDER BY created_at DESC;
-- С индексом используется быстрое чтение
CREATE INDEX idx_products_created_at ON products(created_at DESC);
4. Гарантия уникальности
Уникальный индекс предотвращает дублирование:
CREATE UNIQUE INDEX idx_users_email ON users(email);
-- Попытка вставить дубль вернёт ошибку
Типы индексов
- B-Tree — стандартный индекс для диапазонов и сортировки
- Hash — быстрый поиск по точному совпадению
- GiST / GIN — для полнотекстового поиска и JSON
- Composite — индекс на несколько колонок
-- Composite индекс часто быстрее
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at);
-- Помогает при условиях: WHERE user_id = 5 AND created_at > now()
Компромисс: цена индексов
Минусы индексов:
- Память — индекс занимает место на диске
- Медленная запись — INSERT/UPDATE/DELETE медленнее (СУБД обновляет и таблицу, и индекс)
- Лишние индексы замедляют — квантификатор выбирает оптимальный индекс, но много индексов усложняют выбор
// Node.js пример с Prisma
const user = await prisma.user.findUnique({
where: { email: "test@example.com" } // требует индекса на email
});
// Итерирование по большому результату медленнее без индекса
const users = await prisma.user.findMany({
where: { status: "active" }
// Лучше: CREATE INDEX idx_users_status ON users(status)
});
Правило: когда добавлять индекс
- На поля в WHERE условиях частых запросов
- На внешние ключи (для JOIN)
- На поля, по которым сортируешь (ORDER BY)
- На уникальные поля (PRIMARY KEY, UNIQUE)
- На колонки с низкой кардинальностью только если очень нужны
Не добавляй индекс: если таблица маленькая (<1000 строк), редко читаешь или часто пишешь в неё.
Итог
Индекс — это trade-off память vs скорость. Правильная индексация критична для производительности backend-приложений, особенно при работе с большим объёмом данных.