Ответ
Индексы в базах данных — это специальные структуры данных (чаще всего B-деревья или хеш-таблицы), которые ускоряют операции поиска (WHERE), соединения (JOIN), сортировки (ORDER BY) и группировки (GROUP BY) по определенным столбцам таблицы.
Принцип работы:
Представьте книгу без оглавления. Чтобы найти главу про индексы, вам пришлось бы листать все страницы подряд (полное сканирование таблицы — FULL TABLE SCAN). Индекс работает как оглавление или алфавитный указатель: он хранит значения ключевых столбцов в отсортированном виде вместе со ссылками на соответствующие строки в основной таблице, что позволяет находить данные за несколько шагов (логарифмическое время).
Основные преимущества:
- Резкое увеличение скорости запросов на чтение для больших таблиц.
- Обеспечение уникальности (уникальные индексы).
- Ускорение операций сортировки и группировки, если порядок индекса совпадает с порядком в запросе.
Недостатки и затраты:
- Замедление операций записи (
INSERT,UPDATE,DELETE): при каждом изменении данных необходимо обновлять не только таблицу, но и все связанные индексы. - Дополнительное дисковое пространство.
- Необходимость обслуживания: индексы могут фрагментироваться, их периодически нужно перестраивать (например,
REINDEXв PostgreSQL).
Пример создания и использования:
-- Создание индекса для ускорения поиска пользователей по email
CREATE INDEX idx_users_email ON users(email);
-- Этот запрос теперь может использовать индекс для быстрого поиска
SELECT * FROM users WHERE email = 'alice@example.com';
-- Составной индекс для запросов по нескольким полям
CREATE INDEX idx_users_name_department ON users(last_name, department_id);
-- Индекс будет полезен для запросов:
-- WHERE last_name = '...'
-- WHERE last_name = '...' AND department_id = ...
-- ORDER BY last_name, department_id
Когда индексы могут быть неэффективны или вредны:
- На очень маленьких таблицах (полное сканирование может быть быстрее).
- На столбцах с очень низкой селективностью (например,
genderс значениями 'M'/'F'), где индекс почти не отфильтровывает строк. - При очень частых операциях массовой вставки (например, лог-таблицы).
Вывод: Создание индексов — это искусство баланса между скоростью чтения и стоимостью записи. Их нужно добавлять обдуманно, основываясь на анализе реальных рабочих нагрузок (slow query logs, EXPLAIN plans).