Что такое селективность индекса в базах данных?

Ответ

Селективность индекса (или столбца) в базах данных — это метрика, которая оценивает уникальность данных в этом столбце. Она является ключевым показателем для оптимизатора запросов при выборе наиболее эффективного плана выполнения.

Как рассчитывается?

Селективность вычисляется как отношение количества уникальных значений к общему количеству записей в таблице: Селективность = (Количество уникальных значений) / (Общее количество записей)

Значение варьируется от 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% мусора. А на столбцах, где всего два-три значения, они просто занимают место и тратят время, как мартышка, пытающаяся вкрутить лампочку.