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

Ответ

Индекс по колонке 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) и профилируйте нагрузку перед созданием индекса.

Ответ 18+ 🔞

А, ну ты смотри, опять про индексы заговорили! Как будто это волшебная таблетка от всех тормозов. Так вот, слушай сюда, пока не начал всё подряд индексировать, как последний распиздяй.

Индекс на колонку age — это как костыль. Нужен, только если нога сломана, а не потому что модно. Ставить его стоит, если одновременно сходятся три звезды, то есть условия:

  1. Таблица у тебя реально огромная, как совесть у политика. Десятки, а лучше сотни тысяч строк. На таблице в сто строк индекс — это как приехать на такси в соседний подъезд, ебать мои старые костыли.
  2. Ты постоянно её дёргаешь именно по возрасту: WHERE age > 18, ORDER BY age, GROUP BY age. Если ты раз в полгода спрашиваешь средний возраст, то нахуй он тебе сдался, этот индекс?
  3. Значения в колонке разные, а не как у всех в отделе — всем по 30 лет. Если у тебя 90% записей age = NULL или age = 0, то селективность — пиздец какая низкая. Оптимизатор посмотрит на этот индекс, плюнет и пойдёт делать полный сканирование, потому что так быстрее.

Вот как его, сука, создать, если всё же надо:

-- Простой индекс на возраст
CREATE INDEX idx_users_age ON users(age);
-- А если часто ищешь "молодых из Москвы", то составной
CREATE INDEX idx_users_age_city ON users(age, city_id);

А теперь главное — когда этот индекс будет только вредить, как пидарас шерстяной:

  • Таблица маленькая. Серверу проще всю её разом в память загнать, чем по индексу скакать.
  • Таблицу постоянно пишут/меняют. Каждый INSERT, UPDATE или DELETE по age — это ещё и работа по обновлению этой индексной хуйни. Запись начнёт тормозить, будто по гвоздям ползёт.
  • Селективность низкая. Запрос WHERE age > 10 возвращает 99% строк? Ну и нахуя тогда индекс? Ты же всё равно почти всё выбираешь.

Типичные случаи, где индекс реально выручит:

-- Точечный запрос (если 25-летних не как грязи)
SELECT * FROM users WHERE age = 25;
-- Выборка по диапазону
SELECT * FROM users WHERE age BETWEEN 20 AND 30;
-- Быстрая сортировка для топа
SELECT * FROM users ORDER BY age LIMIT 100;

Итог, блядь: Не твори ересь! Не лепи индексы на всё подряд. Сначала смотри план запроса (EXPLAIN) и замеряй время. Оптимизатор — хитрая жопа, он может проигнорировать твой красивый индекс, если решит, что так будет быстрее. Создал индекс — проверь, используется ли он, или ты просто лишнее место на диске потратил.