Что такое высокая селективность в SQL?

Ответ

Высокая селективность — это свойство условия в запросе, которое отфильтровывает большую часть строк таблицы, оставляя для обработки лишь небольшую их долю. Чем выше селективность, тем эффективнее работает индекс по этому условию.

Почему это важно?

  • Индексы наиболее полезны для столбцов с высокой селективностью (уникальных или почти уникальных значений).
  • Запросы по условиям с низкой селективностью (например, 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, первым делом думай — "а по этому полю часто ищут конкретную запись?" Если да, и значений там овердохуища разных — вешай индекс, не дури. А если поле как "пол" — подозрение ебать чувствую, что индекс будет просто красивой, но бесполезной хуйней в пальто.