Что такое индексы в базах данных и как они влияют на производительность?

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

Ответ

Индекс — это дополнительная структура данных (чаще всего B-дерево), которая ускоряет операции поиска (SELECT), фильтрации (WHERE) и сортировки (ORDER BY), но замедляет вставку (INSERT), обновление (UPDATE) и удаление (DELETE) из-за необходимости поддерживать саму индексную структуру.

Аналогия: Индекс в БД — как алфавитный указатель в книге. Без него нужно просматривать все страницы (полный сканирование таблицы, FULL TABLE SCAN).

Основные типы индексов:

  • B-tree (B+tree): Стандартный, сбалансированный. Подходит для диапазонных запросов (WHERE age BETWEEN 20 AND 30) и сортировки.
  • Hash: Только для поиска по точному совпадению (WHERE id = 123). Быстрее B-tree для =, но не поддерживает диапазоны.
  • Составной (Composite): По нескольким столбцам. Порядок важен: индекс (last_name, first_name) поможет для WHERE last_name='Ivanov', но не для WHERE first_name='Petr'.

Пример создания и анализа:

-- Создание индекса
CREATE INDEX idx_users_email ON users(email);

-- Составной индекс
CREATE INDEX idx_users_name_age ON users(last_name, age);

-- Анализ использования индекса с EXPLAIN
EXPLAIN ANALYZE 
SELECT * FROM users WHERE last_name = 'Ivanov' AND age > 25;
-- В выводе ищем 'Index Scan' или 'Bitmap Index Scan' — это признаки использования индекса.

Best Practices:

  • Индексируйте столбцы, часто используемые в WHERE, JOIN, ORDER BY.
  • Избегайте индексов по часто изменяемым столбцам.
  • Слишком много индексов вредит производительности записи и увеличивает размер БД.
  • Используйте EXPLAIN для проверки плана запроса и выявления отсутствующих индексов.