Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Cardinalidade do índice MySQL - desempenho versus eficiência de armazenamento


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:

  1. Encontre a primeira entrada que satisfaça a condição.

    Isso é feito percorrendo a B-Tree , a partir da entrada raiz.

    Nas páginas, a pesquisa é realizada seguindo B-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 primeiro 3 (em oposição a qualquer 3 ) nestas listas:
    1  2  3  4  5  6  7  8  9  10
    
    3  3  3  3  3  3  3  3  4  4
    

    requer o mesmo O(log(n)) degraus.

  2. 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.