Post #3493
1.95K
Кардинальность в базе данных
(продолжение предыдущего поста)
Cardinality (кардинальность) — это характеристика столбца в таблице базы данных, которая показывает, сколько уникальных значений содержится в этом столбце. Проще говоря, она отражает разнообразие данных в столбце: чем больше уникальных значений, тем выше кардинальность, и наоборот.
На изображении показаны два типа кардинальности на примере таблицы
1. High Cardinality (высокая кардинальность) — столбец содержит много уникальных значений. На схеме к этому типу отнесён столбец
- Обоснование: имена сотрудников, как правило, уникальны или почти уникальны в рамках одной компании. Вероятность совпадения имён относительно низка, поэтому количество уникальных значений в этом столбце будет большим.
- Последствия для индексации: индексы по столбцам с высокой кардинальностью могут быть полезны для поиска конкретных записей (например, «Найти сотрудника с именем Иван»), но они занимают больше места и могут замедлять операции вставки/обновления из-за необходимости поддерживать индекс.
2. Low Cardinality (низкая кардинальность) — столбец содержит относительно мало уникальных значений. На схеме к этому типу отнесён столбец
- Обоснование: в столбце
- Последствия для индексации: индексы по столбцам с низкой кардинальностью часто менее эффективны для поиска, так как они не сильно сужают набор результатов. Например, запрос «Найти всех мужчин» вернёт большую часть таблицы, и индекс может не дать значительного выигрыша в производительности. Такие индексы могут быть избыточными и тратить ресурсы базы данных.
Что не так с приведённым скриптом?
В скрипте создаются индексы для обоих столбцов:
Проблема в том, что:
- Индекс для
- Индекс для
- Пол — это категориальная переменная с малым числом уникальных значений.
- Запросы по полу (
- Создание индекса по такому столбцу тратит ресурсы (память, время на поддержание индекса при вставках/обновлениях) без существенного выигрыша в скорости запросов.
Кардинальность важно учитывать при проектировании индексов в базе данных. Индексы лучше создавать для столбцов с высокой кардинальностью, где они действительно ускоряют поиск. Для столбцов с низкой кардинальностью индексация часто нецелесообразна.
(продолжение предыдущего поста)
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') вернут большую часть данных, и база данных может быстрее обработать такой запрос без индекса.- Создание индекса по такому столбцу тратит ресурсы (память, время на поддержание индекса при вставках/обновлениях) без существенного выигрыша в скорости запросов.
Кардинальность важно учитывать при проектировании индексов в базе данных. Индексы лучше создавать для столбцов с высокой кардинальностью, где они действительно ускоряют поиск. Для столбцов с низкой кардинальностью индексация часто нецелесообразна.
- 🔥 10
- ❤ 3
- ❤🔥 2
- 👍 1
- 😁 1
- 👾 1






