Перейти к содержанию

Индексы в базах данных

Индекс — это специальная структура данных, создаваемая для ускорения поиска, фильтрации и сортировки данных в таблице.


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

  • Ускоряют SELECT-запросы, особенно по WHERE, JOIN, ORDER BY.
  • Используются при соединениях таблиц и агрегатах.
  • Не влияют на результат запроса — только на скорость выполнения.
  • Замедляют операции INSERT, UPDATE, DELETE, так как индексы нужно обновлять.

Типы индексов

Обычный индекс (INDEX)

Создаётся на одном или нескольких столбцах для ускорения поиска.

CREATE INDEX idx_users_email ON users(email);

Уникальный индекс (UNIQUE INDEX)

Не допускает повторяющихся значений — аналогично ограничению UNIQUE.

CREATE UNIQUE INDEX idx_unique_email ON users(email);

Индекс по первичному ключу (PRIMARY KEY)

Создаётся автоматически при создании PRIMARY KEY. Является кластерным индексом в большинстве СУБД.

Составной индекс (на несколько столбцов)

Полезен при фильтрации по нескольким полям в одном запросе.

CREATE INDEX idx_orders_user_date ON orders(user_id, order_date);

Свойства индексов

  • Индексы хранятся отдельно от основной таблицы.

  • Используют структуры данных: B-деревья, хеш-таблицы, реже битовые индексы.

  • Не занимают мало места — чем больше индексов, тем выше нагрузка на диск.

  • При неправильном использовании могут ухудшать производительность (например, при множестве обновлений).


Когда использовать индексы

Использовать:

  • Для часто используемых столбцов в WHERE, JOIN, ORDER BY, GROUP BY.
  • Для внешних ключей.
  • Для уникальных полей (например, email, логин).

Избегать:

  • Индексации столбцов с высокой долей повторяющихся значений (например, флаг is_active).
  • Избыточного количества индексов (особенно в таблицах с частыми изменениями).

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

-- Без индекса:
SELECT * FROM users WHERE email = 'test@example.com';

-- С индексом по email:
-- Быстрый поиск, особенно при большом количестве записей.