Где следует использовать индексы для оптимизации SQL-запросов?

«Где следует использовать индексы для оптимизации SQL-запросов?» — вопрос из категории SQL и базы данных, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Индексы используются для ускорения операций чтения (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), так как индексную структуру также необходимо обновлять.