Maior cardinalidade significa melhor desempenho de leitura porque, por definição, há menos registros a serem lidos.
Para processar uma consulta como esta:
SELECT *
FROM mytable
WHERE indexed_col = @myvalue
, o mecanismo deve executar as seguintes etapas:
-
Encontre a primeira entrada que satisfaça a condição.
Isso é feito percorrendo aB-Tree
, a partir da entrada raiz.
Nas páginas, a pesquisa é realizada seguindoB-Tree
ligações; dentro de uma página, a pesquisa é realizada usando pesquisa binária (a menos que suas chaves sejam compactadas, caso em que é uma pesquisa linear).
Esse algoritmo tem a mesma eficiência para colunas de alta cardinalidade e baixa cardinalidade. Encontrando o primeiro3
(em oposição a qualquer3
) nestas listas:
1 2 3 4 5 6 7 8 9 10 3 3 3 3 3 3 3 3 4 4
requer o mesmoO(log(n))
degraus.
-
Percorrendo o índice até que o valor da chave seja alterado. Isso, é claro, requer tempo linear:quanto mais registros você tiver, mais precisará percorrer.
Se você precisar apenas do primeiro registro:
SELECT *
FROM mytable
WHERE indexed_col = @myvalue
LIMIT 1
, a cardinalidade da coluna não afeta o desempenho de leitura.
Cada chave de índice tem um valor adicional oculto:um ponteiro de registro. Este é o ponto de ter um índice:você precisa saber para qual registro ele aponta.
Como um ponteiro de registro, por definição, é único, cada chave de índice também é única. As entradas de índice que compartilham o mesmo valor de chave são classificadas pelo ponteiro de registro.
Isso é para tornar o índice sustentável:se você excluir um registro com um valor de uma coluna indexada compartilhada por um milhão de outros registros, o registro de índice correspondente também deverá ser excluído. Mas todo o milhão de registros de índice não está sendo examinado:em vez disso, o ponteiro de registro é usado como uma condição de pesquisa adicional.
Cada chave de índice é de fato única (mesmo que você não defina o índice como único) e, portanto, tem a máxima cardinalidade possível.
Portanto, a resposta para suas perguntas é:não, a cardinalidade da coluna não afeta o desempenho da gravação do índice.