TGViewer
METANIT.COM METANIT.COM @devnull22 · 5.83K subscribers
Post #3493 1.95K
Кардинальность в базе данных
(продолжение предыдущего поста)

Cardinality (кардинальность) — это характеристика столбца в таблице базы данных, которая показывает, сколько уникальных значений содержится в этом столбце. Проще говоря, она отражает разнообразие данных в столбце: чем больше уникальных значений, тем выше кардинальность, и наоборот.

На изображении показаны два типа кардинальности на примере таблицы Employees:

1. High Cardinality (высокая кардинальность) — столбец содержит много уникальных значений. На схеме к этому типу отнесён столбец Name (имя сотрудника).
- Обоснование: имена сотрудников, как правило, уникальны или почти уникальны в рамках одной компании. Вероятность совпадения имён относительно низка, поэтому количество уникальных значений в этом столбце будет большим.
- Последствия для индексации: индексы по столбцам с высокой кардинальностью могут быть полезны для поиска конкретных записей (например, «Найти сотрудника с именем Иван»), но они занимают больше места и могут замедлять операции вставки/обновления из-за необходимости поддерживать индекс.

2. Low Cardinality (низкая кардинальность) — столбец содержит относительно мало уникальных значений. На схеме к этому типу отнесён столбец Gender (пол).
- Обоснование: в столбце Gender обычно всего 2 уникальных значения (например, «M» для мужского, «F» для женского, возможно, на случай, например, если человек не захочет указывать, мы можем добавить еще вариант, но количество уникальных значений в итоге все равно будет небольшим). Это делает кардинальность низкой.
- Последствия для индексации: индексы по столбцам с низкой кардинальностью часто менее эффективны для поиска, так как они не сильно сужают набор результатов. Например, запрос «Найти всех мужчин» вернёт большую часть таблицы, и индекс может не дать значительного выигрыша в производительности. Такие индексы могут быть избыточными и тратить ресурсы базы данных.

Что не так с приведённым скриптом?

В скрипте создаются индексы для обоих столбцов: Name и Gender:
CREATE INDEX idx_name ON Employees(Name);
CREATE INDEX idx_gender ON Employees(Gender);

Проблема в том, что:
- Индекс для Name (высокая кардинальность) может быть полезен, так как помогает быстро находить конкретных сотрудников по имени.
- Индекс для Gender (низкая кардинальность) скорее всего бесполезен, так как:
- Пол — это категориальная переменная с малым числом уникальных значений.
- Запросы по полу (WHERE Gender = 'M') вернут большую часть данных, и база данных может быстрее обработать такой запрос без индекса.
- Создание индекса по такому столбцу тратит ресурсы (память, время на поддержание индекса при вставках/обновлениях) без существенного выигрыша в скорости запросов.

Кардинальность важно учитывать при проектировании индексов в базе данных. Индексы лучше создавать для столбцов с высокой кардинальностью, где они действительно ускоряют поиск. Для столбцов с низкой кардинальностью индексация часто нецелесообразна.
Telegram METANIT.COM Кардинальность в базе данных (продолжение в следующем посте)
  • 🔥 10
  • ❤ 3
  • ❤‍🔥 2
  • 👍 1
  • 😁 1
  • 👾 1
More from @devnull22
  1. Mar 19, 2026Добавил в руководство по JavaScript главу про работу с датами и временем с помощью Tempora…
  2. Mar 19, 2026Роскомнадзор перестал полностью справляться с блокировками в интернете Роскомнадзор (РКН)…
  3. Mar 18, 2026Минцифры опубликовало законопроект о государственном регулировании ИИ. Закон должен начать…
  4. Mar 18, 2026Microsoft призвала разработчиков создавать ИИ-приложения в Electron на Windows 11 Microsof…
  5. Mar 18, 2026Oracle анонсировала проект Detroit, который будет развиваться в составе OpenJDK и нацелен…
  6. Mar 17, 2026Вышла новая версия платформы Java - JDK 26. JDK 26 — краткосрочная версия с поддержкой Pre…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →