Ответ
Селективность индекса (или столбца) в базах данных — это метрика, которая оценивает уникальность данных в этом столбце. Она является ключевым показателем для оптимизатора запросов при выборе наиболее эффективного плана выполнения.
Как рассчитывается?
Селективность вычисляется как отношение количества уникальных значений к общему количеству записей в таблице:
Селективность = (Количество уникальных значений) / (Общее количество записей)
Значение варьируется от 0 до 1. Чем ближе к 1, тем выше селективность.
- Высокая селективность (близка к 1): Значения в столбце почти не повторяются.
- Примеры:
id,email,passport_number.
- Примеры:
- Низкая селективность (близка к 0): Значения в столбце часто повторяются.
- Примеры:
gender,is_active(boolean),country_codeв таблице пользователей одной страны.
- Примеры:
Зачем это нужно?
Оптимизатор запросов использует селективность, чтобы решить, использовать ли индекс для поиска данных.
- При высокой селективности запрос
WHERE email = 'test@example.com'вернет очень мало строк. Оптимизатор, скорее всего, выберет Index Scan, так как это будет намного быстрее, чем полный перебор таблицы. - При низкой селективности запрос
WHERE is_active = trueможет вернуть половину таблицы. В этом случае чтение индекса и последующий доступ к таблице может быть дороже, чем просто прочитать всю таблицу целиком (Full Table Scan).
-- Запрос по столбцу с ВЫСОКОЙ селективностью. Скорее всего, будет использован индекс.
SELECT * FROM users WHERE id = 12345;
-- Запрос по столбцу с НИЗКОЙ селективностью. Использование индекса маловероятно.
SELECT * FROM users WHERE gender = 'M';
Вывод: Индексы наиболее эффективны для столбцов с высокой селективностью, так как они позволяют быстро отсеять подавляющее большинство строк.
Ответ 18+ 🔞
А, слушай, вот эта ваша селективность индекса — это вообще пиздец как важно понять, если хочешь, чтобы база не тормозила как старая кобыла в гору. Представь себе, это типа как мера уникальности данных в столбце. Оптимизатор запросов на неё пялится, когда решает, по какому плану тебе всё выдать, чтобы не овердохуища времени ушло.
Как эту хрень считают?
Всё просто, блядь. Берут количество уникальных значений и делят на общее количество строк в таблице. Формула, на:
Селективность = (Количество уникальных значений) / (Общее количество записей)
Получается число от 0 до 1. Чем ближе к единице — тем селективность выше, и наоборот.
- Высокая селективность (близко к 1): Значения почти не повторяются, уникальные как отпечатки пальцев у мартышлюшки.
- Примеры:
id,email,passport_number. Там один юзер — одна запись, нихуя не совпадёт.
- Примеры:
- Низкая селективность (близко к 0): Значения повторяются чаще, чем слово «блядь» в моей речи.
- Примеры:
gender,is_active(булево значение),country_codeв таблице пользователей одной страны. Там на миллион строк может быть три варианта, пиздец.
- Примеры:
А нахуя это вообще надо, спросишь ты?
А вот нахуя! Оптимизатор запросов, этот хитрожопый аналитик, смотрит на селективность и думает: «Использовать индекс или нет?». И от этого решения зависит, будет твой запрос летать или ползти как черепаха с грузом.
- Если селективность высокая, например, запрос
WHERE email = 'test@example.com'— он вернёт одну строчку, максимум две. Очевидно же, что быстрее найти её по индексу (Index Scan), чем перерывать всю таблицу, как помойку. - Если селективность низкая, например,
WHERE is_active = true— это может вернуть половину всей таблицы, блядь! И тогда оптимизатор такой: «А нахуя мне сканировать индекс, потом по нему лазить по таблице, если можно сразу всю таблицу прочитать (Full Table Scan) и быстрее будет?». И он будет прав, ёпта!
-- Запрос по столбцу с ВЫСОКОЙ селективностью. Индекс тут наш лучший друг.
SELECT * FROM users WHERE id = 12345;
-- Запрос по столбцу с НИЗКОЙ селективностью. Индекс тут, скорее всего, бесполезная хуйня.
SELECT * FROM users WHERE gender = 'M';
Короче, вывод простой, как палка: Индексы — это оружие избирательного поражения. Они охуенно работают на столбцах с высокой селективностью, где нужно быстро отсеять 99% мусора. А на столбцах, где всего два-три значения, они просто занимают место и тратят время, как мартышка, пытающаяся вкрутить лампочку.