Какие факторы снижают эффективность индексов в базе данных?

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

Ответ

Эффективность индексов снижают следующие факторы:

1. Неоптимальные запросы:

  • Использование функций или выражений в WHERE: Индекс по created_at не будет использован.
    -- ПЛОХО: Индекс не используется
    SELECT * FROM orders WHERE DATE(created_at) = '2024-01-01';
    -- ХОРОШО: Индекс используется (поиск по диапазону)
    SELECT * FROM orders WHERE created_at >= '2024-01-01' AND created_at < '2024-01-02';
  • Приведение типов (implicit casting): Запрос с WHERE string_column = 123 может привести к полному сканированию.

2. Плохая структура индекса:

  • Неправильный порядок столбцов в составном индексе: Индекс (A, B) не оптимизирует запрос с условием только по B.
  • Низкая селективность: Индекс по столбцу с малым количеством уникальных значений (например, gender, status) часто неэффективен, так как возвращает большую часть таблицы.

3. Состояние базы данных:

  • Фрагментация индекса: После множества операций UPDATE/DELETE индекс становится фрагментированным, что увеличивает время чтения.
  • Устаревшая статистика: Оптимизатор запросов принимает плохие решения, если статистика по распределению данных не актуальна.

4. Чрезмерное индексирование:

  • Много индексов на часто изменяемой таблице: Каждый INSERT, UPDATE, DELETE должен модифицировать все связанные индексы, что замедляет запись.
  • Дублирующие индексы: Например, индексы (A, B) и (A) избыточны, так как первый уже может обслуживать запросы только по A.

Решение: Регулярно анализировать планы выполнения запросов (EXPLAIN), удалять неиспользуемые индексы и перестраивать фрагментированные.