Когда стоит создавать индекс по колонке с возрастом в таблице пользователей?

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

Ответ

Индекс по колонке age стоит создавать, если выполняются все условия:

  1. Таблица большая (десятки/сотни тысяч строк и более).
  2. Часто выполняются запросы с фильтрацией или сортировкой по возрасту (WHERE, ORDER BY, GROUP BY).
  3. Столбец обладает достаточной селективностью (значения распределены относительно равномерно, а не 90% записей имеют age=30).

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

CREATE INDEX idx_users_age ON users(age);
-- Для составных запросов (age + city)
CREATE INDEX idx_users_age_city ON users(age, city_id);

Когда индекс НЕ нужен или вреден:

  • Маленькая таблица: Полное сканирование (Full Scan) будет быстрее.
  • Частые операции DML (INSERT/UPDATE/DELETE): Каждое изменение потребует обновления индекса, что замедлит запись.
  • Низкая селективность: Если по условию WHERE age > 18 отбирается 95% строк, индекс, скорее всего, не будет использован.

Типичные запросы, выигрывающие от индекса:

-- Точечный поиск (если селективность высока)
SELECT * FROM users WHERE age = 25;
-- Диапазонный поиск
SELECT * FROM users WHERE age BETWEEN 20 AND 30;
-- Сортировка
SELECT * FROM users ORDER BY age LIMIT 100;

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