Ответ
Индекс по колонке age стоит создавать, если выполняются все условия:
- Таблица большая (десятки/сотни тысяч строк и более).
- Часто выполняются запросы с фильтрацией или сортировкой по возрасту (
WHERE,ORDER BY,GROUP BY). - Столбец обладает достаточной селективностью (значения распределены относительно равномерно, а не 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 — это как костыль. Нужен, только если нога сломана, а не потому что модно. Ставить его стоит, если одновременно сходятся три звезды, то есть условия:
- Таблица у тебя реально огромная, как совесть у политика. Десятки, а лучше сотни тысяч строк. На таблице в сто строк индекс — это как приехать на такси в соседний подъезд, ебать мои старые костыли.
- Ты постоянно её дёргаешь именно по возрасту:
WHERE age > 18,ORDER BY age,GROUP BY age. Если ты раз в полгода спрашиваешь средний возраст, то нахуй он тебе сдался, этот индекс? - Значения в колонке разные, а не как у всех в отделе — всем по 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) и замеряй время. Оптимизатор — хитрая жопа, он может проигнорировать твой красивый индекс, если решит, что так будет быстрее. Создал индекс — проверь, используется ли он, или ты просто лишнее место на диске потратил.