Ответ
Индексы используются для ускорения операций чтения (SELECT) за счёт дополнительных затрат на запись (INSERT/UPDATE/DELETE) и дисковое пространство. Их применение наиболее эффективно в следующих сценариях:
1. Ускорение поиска по условию WHERE:
-- Без индекса на `email` этот запрос выполнит полное сканирование таблицы (FULL SCAN).
SELECT * FROM users WHERE email = 'alice@example.com';
-- Создание индекса кардинально ускорит поиск.
CREATE INDEX idx_users_email ON users(email);
2. Ускорение операций JOIN: Индексы на столбцах, используемых для соединения таблиц, критически важны для производительности.
-- Индекс на foreign key column `department_id` ускорит JOIN.
CREATE INDEX idx_employees_department_id ON employees(department_id);
SELECT e.name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.id;
3. Поддержка операций сортировки (ORDER BY) и группировки (GROUP BY): Если запрос часто сортирует или группирует по определённым столбцам, индекс по этим столбцам может исключить дорогостоящую операцию сортировки в памяти.
CREATE INDEX idx_orders_date_customer ON orders(order_date, customer_id);
-- Этот запрос может использовать индекс для эффективной сортировки.
SELECT customer_id, SUM(amount) FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
ORDER BY customer_id;
4. Обеспечение уникальности (UNIQUE CONSTRAINT): Ограничение уникальности автоматически создаёт уникальный индекс.
ALTER TABLE products ADD CONSTRAINT uq_product_sku UNIQUE (sku);
Важные замечания:
- Высокая кардинальность: Индексы наиболее полезны для столбцов с большим количеством уникальных значений.
- Составные индексы: Эффективны для запросов с несколькими условиями в WHERE. Порядок столбцов в индексе имеет значение.
- Мониторинг и обслуживание: Неиспользуемые индексы следует удалять, а фрагментированные — перестраивать (REBUILD/REORGANIZE).
- Затраты: Индексы замедляют операции DML (INSERT, UPDATE, DELETE), так как индексную структуру также необходимо обновлять.