Ответ
Высокая селективность — это свойство условия в запросе, которое отфильтровывает большую часть строк таблицы, оставляя для обработки лишь небольшую их долю. Чем выше селективность, тем эффективнее работает индекс по этому условию.
Почему это важно?
- Индексы наиболее полезны для столбцов с высокой селективностью (уникальных или почти уникальных значений).
- Запросы по условиям с низкой селективностью (например,
gender = 'M') часто приводят к полному сканированию таблицы (FULL SCAN), так как использование индекса может быть менее эффективно.
Примеры селективности:
-- НИЗКАЯ селективность: условие верно для ~50% строк
SELECT * FROM users WHERE gender = 'M';
-- ВЫСОКАЯ селективность: условие верно для 1-2 строк
SELECT * FROM users WHERE email = 'admin@example.com';
SELECT * FROM orders WHERE id = 12345;
Практическое правило: При проектировании индексов в JPA/Hibernate или нативном SQL в первую очередь индексируйте столбцы с высокой селективностью.
Ответ 18+ 🔞
А, слушай, вот эта ваша "высокая селективность" — это вообще пиздец как важно понять, если хочешь, чтобы база не легла как корова на льду.
Представь себе, что ты — вышибала в клубе. У тебя есть список гостей. Высокая селективность — это когда ты ищешь не "всех мужиков" (их там половина, пиздец), а конкретного чувака по паспорту, где фотка и номер. Ты его — хвать! — и сразу нашёл. Эффективно, быстро, все довольны. Индекс — он как раз такой вышибала-профи.
А если селективность низкая? Это как если бы вышибале сказали: "пропусти всех, у кого кроссовки". Он нихуя не сделает, будет всех подряд смотреть, потому что условие ебаное слишком широкое. Базе так же хуёво: проще всю таблицу прочитать, чем по индексу прыгать туда-сюда.
Короче, запомни как "Отче наш":
- Индексируй то, что уникально или почти уникально.
email,id,номер паспорта— вот это всё. По ним искать — одно удовольствие, ебать мои старые костыли. - Не индексируй то, где значений — три штуки.
пол,статус заказа(если их 5 штук),да/нет. От такого индекса часто хуй без руля — оптимизатор его проигнорит и пойдёт сканировать всё подряд, потому что так быстрее.
Смотри, как на примерах:
-- Это пиздец какая НИЗКАЯ селективность. Половина таблицы тебе вылезет.
-- Индекс на `gender` — деньги на ветер, в рот меня чих-пых.
SELECT * FROM users WHERE gender = 'M';
-- А вот это — ВЫСОКАЯ. Админ, он, блядь, обычно один такой на всю систему.
-- Индекс на `email` — святое дело, ёпта.
SELECT * FROM users WHERE email = 'admin@example.com';
-- И это тоже. IDшник — он и в Африке уникальный.
SELECT * FROM orders WHERE id = 12345;
Итог, чувак: Когда проектируешь сущности в Hibernate или пишешь SQL, первым делом думай — "а по этому полю часто ищут конкретную запись?" Если да, и значений там овердохуища разных — вешай индекс, не дури. А если поле как "пол" — подозрение ебать чувствую, что индекс будет просто красивой, но бесполезной хуйней в пальто.