Почему не следует создавать индексы для всех столбцов таблицы SQL?

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

Ответ

Создание индексов на все столбцах — антипаттерн, который приводит к значительным проблемам с производительностью и обслуживанием базы данных.

Основные причины:

  1. Высокая стоимость операций записи (INSERT, UPDATE, DELETE):

    • Каждый индекс — это отдельная структура данных (чаще всего B-дерево), которую необходимо обновлять синхронно с таблицей.
    • Это увеличивает время записи и блокировки.
  2. Избыточное использование дискового пространства и памяти:

    • Индексы могут занимать объем, сопоставимый с самой таблицей.
    • В оперативной памяти (буферном кэше) хранятся копии индексов, что вытесняет другие полезные данные.
  3. Усложнение работы оптимизатора запросов:

    • Наличие множества индексов увеличивает время, необходимое оптимизатору для выбора наилучшего плана выполнения.
    • Возрастает риск выбора неоптимального индекса.

Пример плохой практики:

CREATE TABLE orders (
    id INT PRIMARY KEY,
    customer_id INT,
    product_id INT,
    amount DECIMAL(10,2),
    order_date DATE,
    status VARCHAR(20),
    -- Избыточные индексы на все поля:
    INDEX (customer_id),
    INDEX (product_id),
    INDEX (amount),
    INDEX (order_date),
    INDEX (status)
);

Рекомендация: Индексы следует создавать целенаправленно для столбцов, которые:

  • Часто используются в условиях WHERE.
  • Участвуют в операциях JOIN.
  • Используются для сортировки (ORDER BY) или группировки (GROUP BY).