Index cardinality

Първо, да не се бърка с table cardinality, което значи „броят записи избщо в таблицата“.

Index cardinality refers to the uniqueness of values stored in a specified column within an index.

Явно затова кардиналността на UNIQUE индексите е равна на броя редове, върху които е даденият UNIQUE индекс, просто всички са уникални.

Aми ако има NULL стойности? Те как се броят за кардиналността? Групират се и се броят като уникални, като отделни, уникални стойности?
Тоест ако имаме 20 уникални not null стойности и отделно още примерно 3 NULL-а, (следователно – 23 реда в таблицата), кардиналността ще е 23!

Тоест, броя уникални + броя NULL стойности.

Колкото кардиналността на индекса е по-малка от броя редове на таблицата (table cardinality), толкова по-малко са уникалните стойности на това поле.

A unique index would have cardinality equal to the number of rows in the table.  But a non-unique index can have a cardinality of anywhere from 1 to the number of rows in the table, depending on how many times each index key appears in the table.

Каква е принципната полза от кардиналността?

Една полза би била за да се подобри т.н. „selectivity“ на даденото поле/полета. Колкото по-голяма е кардиналността (тоест броя уникални стойности на базата на общият брой стойности), това значи, че дадената SELECT заявка ще използва даеният индекс по-оптимално, за намиране на търсеният резултат, с по-малко търсене.

Селективността може лесно да се намери като разделим броя уникални стойности на общият брой стойности. Идеалната селективност е 1. Демек, идеалният индекс е този който не съдържа повтарящи се стойности.

Колкото селективността е по-близо до 1, толкова повече има смисъл от индекс за това поле/полета. Както и обратното – колкото по-малко на брой уникални стойности имаме, в отношение с целият брой стойности – толкова повече индексът би бил безсмислен.

Колкото селективността на един индекс е по-близо до 1, толкова и ползата му е по-голяма. Поне за B-tree индексите. За да си го представим по-нагледно, спомнете си за онази игра, дето пускаш едно топче по едни възли и на всеки възел може да отиде или на ляво, или на дясно…

Литература:

https://www.ibm.com/developerworks/data/library/techarticle/dm-1309cardinal/index.html

https://orangematter.solarwinds.com/2020/01/05/what-is-cardinality-in-a-database/

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *