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

«Что такое кардинальность (cardinality) индекса в базах данных?» — вопрос из категории Базы данных, который задают на 28% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Кардинальность индекса — это оценка уникальности значений в индексируемом столбце или комбинации столбцов. Она показывает, насколько эффективно индекс может отфильтровать строки.

Уровни кардинальности:

  1. Высокая: Столбец содержит много уникальных или почти уникальных значений (например, email, primary key). Индекс очень эффективен.
  2. Низкая: Столбец содержит мало уникальных значений (например, gender, status). Индекс может быть неэффективен, и оптимизатор СУБД может его проигнорировать.

Пример в SQL:

-- Высокая кардинальность: индекс очень полезен
CREATE INDEX idx_user_email ON users(email);

-- Низкая кардинальность: индекс, скорее всего, бесполезен для поиска по одному статусу
CREATE INDEX idx_order_status ON orders(status); -- status может быть 'new', 'processed', 'shipped'

-- Комбинированный индекс может иметь хорошую кардинальность
CREATE INDEX idx_status_created ON orders(status, created_at);

Почему это важно для оптимизатора запросов? Оптимизатор использует статистику по кардинальности, чтобы решить:

  • Использовать ли индекс или выполнить полное сканирование таблицы.
  • Какой индекс выбрать, если доступно несколько.
  • Порядок соединения таблиц (JOIN). Индекс с высокой кардинальностью лучше сужает поиск.