← Назад к вопросам

Зачем нужен индекс?

2.0 Middle🔥 201 комментариев
#Базы данных и SQL#Кэширование и производительность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Зачем нужен индекс?

Индекс — это структура данных в БД, которая значительно ускоряет поиск и сортировку данных. Без индекса СУБД вынуждена выполнять полное сканирование таблицы (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)
});

Правило: когда добавлять индекс

  1. На поля в WHERE условиях частых запросов
  2. На внешние ключи (для JOIN)
  3. На поля, по которым сортируешь (ORDER BY)
  4. На уникальные поля (PRIMARY KEY, UNIQUE)
  5. На колонки с низкой кардинальностью только если очень нужны

Не добавляй индекс: если таблица маленькая (<1000 строк), редко читаешь или часто пишешь в неё.

Итог

Индекс — это trade-off память vs скорость. Правильная индексация критична для производительности backend-приложений, особенно при работе с большим объёмом данных.