Una cardinalità più alta significa prestazioni di lettura migliori perché, per definizione, ci sono meno record da leggere.
Per elaborare una query come questa:
SELECT *
FROM mytable
WHERE indexed_col = @myvalue
, il motore dovrebbe eseguire i seguenti passaggi:
-
Trova la prima voce che soddisfa la condizione.
Questo viene fatto attraversando il
B-Tree
, a partire dalla voce radice.Attraverso le pagine, la ricerca viene effettuata seguendo
B-Tree
collegamenti; all'interno di una pagina, la ricerca viene eseguita utilizzando la ricerca binaria (a meno che le chiavi non siano compresse, nel qual caso si tratta di una ricerca lineare).Questo algoritmo ha la stessa efficienza sia per colonne ad alta cardinalità che per colonne a bassa cardinalità. Trovare il primo
3
(al contrario di qualsiasi3
) in questi elenchi:1 2 3 4 5 6 7 8 9 10 3 3 3 3 3 3 3 3 4 4
richiede lo stesso
O(log(n))
passi. -
Attraversamento dell'indice finché il valore della chiave non cambia. Questo, ovviamente, richiede un tempo lineare:più record hai, più devi attraversare.
Se ti serve solo il primo record:
SELECT *
FROM mytable
WHERE indexed_col = @myvalue
LIMIT 1
, la cardinalità della colonna non influisce sulle prestazioni di lettura.
Ogni chiave di indice ha un valore aggiuntivo nascosto:un puntatore di record. Questo è lo scopo principale dell'avere un indice:devi sapere a quale record punta.
Poiché un puntatore di record, per definizione, è univoco, anche ogni chiave di indice è univoca. Le voci dell'indice che condividono lo stesso valore di chiave vengono ordinate in base al puntatore del record.
Questo per rendere l'indice gestibile:se si elimina un record con un valore di una colonna indicizzata condivisa da un milione di altri record, anche il record dell'indice corrispondente dovrebbe essere eliminato. Ma l'intero milione di record dell'indice non viene esaminato:invece, il puntatore del record viene utilizzato come condizione di ricerca aggiuntiva.
Ogni chiave di indice è infatti unica (anche se non si definisce l'indice come unico) e, quindi, ha la massima cardinalità possibile.
Quindi la risposta alle tue domande è:no, la cardinalità della colonna non influisce sulle prestazioni di scrittura dell'indice.