Ответ
Селективность индекса (или столбца) в базах данных — это метрика, которая оценивает уникальность данных в этом столбце. Она является ключевым показателем для оптимизатора запросов при выборе наиболее эффективного плана выполнения.
Как рассчитывается?
Селективность вычисляется как отношение количества уникальных значений к общему количеству записей в таблице:
Селективность = (Количество уникальных значений) / (Общее количество записей)
Значение варьируется от 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';
Вывод: Индексы наиболее эффективны для столбцов с высокой селективностью, так как они позволяют быстро отсеять подавляющее большинство строк.