Większa kardynalność oznacza lepszą wydajność odczytu, ponieważ z definicji jest mniej rekordów do odczytania.
Aby przetworzyć zapytanie w ten sposób:
SELECT *
FROM mytable
WHERE indexed_col = @myvalue
, silnik powinien wykonać następujące czynności:
-
Znajdź pierwszy wpis spełniający warunek.
Odbywa się to przechodząc przez
B-Tree
, zaczynając od wpisu głównego.Na wszystkich stronach wyszukiwanie odbywa się za pomocą
B-Tree
spinki do mankietów; w obrębie strony wyszukiwanie odbywa się za pomocą wyszukiwania binarnego (chyba że klucze są skompresowane, w takim przypadku jest to wyszukiwanie liniowe).Ten algorytm ma taką samą wydajność dla kolumn o wysokiej kardynalności i niskiej kardynalności. Znajdowanie pierwszych
3
(w przeciwieństwie do3
) na tych listach:1 2 3 4 5 6 7 8 9 10 3 3 3 3 3 3 3 3 4 4
wymaga tego samego
O(log(n))
kroki. -
Przemierzanie indeksu aż do zmiany wartości klucza. To oczywiście wymaga czasu liniowego:im więcej masz rekordów, tym więcej musisz przebyć.
Jeśli potrzebujesz tylko pierwszego rekordu:
SELECT *
FROM mytable
WHERE indexed_col = @myvalue
LIMIT 1
, kardynalność kolumny nie wpływa na wydajność odczytu.
Każdy klucz indeksu ma ukrytą wartość dodatkową:wskaźnik rekordu. To jest cały sens posiadania indeksu:musisz wiedzieć, na który rekord on wskazuje.
Ponieważ wskaźnik rekordu z definicji jest unikalny, każdy klucz indeksu jest również unikalny. Wpisy indeksu o tej samej wartości klucza są sortowane według wskaźnika rekordu.
Ma to na celu umożliwienie konserwacji indeksu:jeśli usuniesz rekord z wartością zindeksowanej kolumny współdzielonej przez milion innych rekordów, odpowiedni rekord indeksu również powinien zostać usunięty. Ale cały milion rekordów indeksu nie jest przeglądany:zamiast tego wskaźnik rekordu jest używany jako dodatkowy warunek wyszukiwania.
Każdy klucz indeksu jest w rzeczywistości unikalny (nawet jeśli nie zdefiniujesz indeksu jako unikalnego), a zatem ma maksymalną możliwą kardynalność.
Odpowiedź na twoje pytania brzmi:nie, kardynalność kolumn nie wpływa na wydajność zapisu indeksu.