Является ли создание индексов на всех полях таблицы хорошей практикой?

«Является ли создание индексов на всех полях таблицы хорошей практикой?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, это антипаттерн, который приводит к серьезным проблемам с производительностью.

Негативные последствия:

  1. Замедление операций записи (INSERT, UPDATE, DELETE): При каждой модификации данных СУБД должна обновлять все индексы, что значительно увеличивает нагрузку на ввод-вывод и время выполнения.
  2. Избыточное потребление памяти/диска: Каждый индекс — это дополнительная структура данных, занимающая место.
  3. Усложнение работы оптимизатора: Избыток индексов может запутать планировщик запросов, что приведет к выбору неоптимального плана выполнения.

Рекомендации по созданию индексов:

  • Индексируйте поля, используемые в условиях WHERE, JOIN, ORDER BY, GROUP BY.
  • Рассматривайте составные индексы для часто используемых комбинаций полей.
  • Избегайте индексов на:
    • Поля с низкой селективностью (например, gender, status с малым числом значений).
    • Поля, которые редко используются в запросах.

Пример плохого и хорошего подхода:

-- ПЛОХО: Индекс на все поля
CREATE INDEX idx_bad ON users (id, name, email, created_at, status);

-- ХОРОШО: Специфичные индексы под запросы
CREATE INDEX idx_users_email ON users(email); -- Для поиска по email
CREATE INDEX idx_users_created_status ON users(created_at, status); -- Для отчетов

Вывод: Индексы должны создаваться целенаправленно, на основе анализа реальной нагрузки и частых запросов.