Индексы в базах данных¶
Индекс — это специальная структура данных, создаваемая для ускорения поиска, фильтрации и сортировки данных в таблице.
Зачем нужны индексы?¶
- Ускоряют 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:
-- Быстрый поиск, особенно при большом количестве записей.