Приведите пример плохого или избыточного использования индексов в SQL.

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

Ответ

Классический пример — создание индексов на столбцы с низкой селективностью или дублирующих друг друга индексов, что замедляет операции записи (INSERT, UPDATE, DELETE) без выигрыша в чтении.

Пример 1: Индекс на столбец с малым количеством уникальных значений (низкая селективность).

-- Плохо: столбец 'status' может иметь всего 3-4 значения ('active', 'inactive', 'pending')
CREATE INDEX idx_status ON orders (status);

-- Запрос все равно просканирует большую часть таблицы
SELECT * FROM orders WHERE status = 'pending'; -- Индекс почти бесполезен

Пример 2: Избыточные индексы.

-- Допустим, есть составной индекс
CREATE INDEX idx_name_department ON employees (last_name, department_id);

-- Создание этого индекса часто избыточно, т.к. по первому столбцу составного индекса уже можно искать
CREATE INDEX idx_name ON employees (last_name); -- ЛИШНИЙ ИНДЕКС
-- Запрос `WHERE last_name = 'Smith'` уже может использовать `idx_name_department`.

Пример 3: Индексы на часто изменяемые небольшие таблицы.

-- Таблица 'config' содержит 10 строк и обновляется часто
CREATE INDEX idx_config_key ON config (config_key);
-- Накладные расходы на поддержку индекса при каждой записи могут превысить редкую пользу от поиска.

Практическое правило: Перед созданием индекса я анализирую запросы через EXPLAIN ANALYZE и учитываю селективность столбца, частоту операций записи и уже существующие индексы.