Когда не следует добавлять индексы в базу данных?

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

Ответ

Добавление индексов не рекомендуется в следующих случаях:

1. На столбцах с низкой селективностью:

  • Булевы значения (is_active, gender)
  • Перечисления с малым количеством вариантов
  • Почему: Индекс неэффективен, когда нужно выбрать большую часть таблицы
-- Плохой кандидат для индекса
CREATE INDEX idx_status ON orders(status); 
-- status имеет только 3 значения: 'NEW', 'PROCESSING', 'DONE'

2. На часто изменяемых таблицах:

  • Каждый INSERT, UPDATE, DELETE требует обновления индексов
  • Замедляет операции записи
  • Увеличивает размер таблицы

3. На маленьких таблицах:

  • Полное сканирование (full table scan) может быть быстрее
  • Обычно для таблиц < 1000 строк

4. Когда запросы не могут использовать индекс:

  • Использование функций над столбцом:

    -- Индекс по name не будет использован
    SELECT * FROM users WHERE UPPER(name) = 'JOHN';
  • Поиск с LIKE с начальным wildcard:

    
    -- Индекс не используется
    SELECT * FROM products WHERE name LIKE '%apple%';

-- Индекс МОЖЕТ использоваться SELECT * FROM products WHERE name LIKE 'apple%';



**5. При избыточных индексах:**
- Несколько индексов с пересекающимися столбцами
- Индексы, которые никогда не используются
- **Решение:** Анализировать `EXPLAIN` и статистику использования

**Общее правило:** Добавляйте индексы обдуманно, анализируя:
1. Селективность столбцов
2. Соотношение операций чтения/записи
3. Фактические запросы приложения
4. Размер таблицы