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

Por que a cardinalidade de um índice no MySQL permanece inalterada quando adiciono um novo índice?


Se você tiver apenas 1 linha na tabela, a cardinalidade do índice deve ser 1, é claro. É apenas contar o número de valores únicos.

Se você pensar em um índice como uma tabela de pesquisa baseada em buckets (como um hash), a cardinalidade é o número de buckets.

Veja como funciona:Quando você cria um índice sobre um conjunto de colunas (a,b,c,d) , então o banco de dados percorre todas as linhas da tabela, olhando para os quadrigêmeos ordenados dessas 4 colunas, para cada linha. Digamos que sua tabela esteja assim:
a  b  c  d  e   
-- -- -- -- --  
1  1  1  1  200 
1  1  1  1  300
1  2  1  1  200
1  3  1  1  200

Então, o que o banco de dados analisa são apenas as 4 colunas (a,b,c,d):
a  b  c  d  
-- -- -- --
1  1  1  1 
1  2  1  1 
1  3  1  1 

Viu que restam apenas 3 linhas exclusivas? Esses se tornarão nossos baldes, mas voltaremos a isso. Na realidade, há também um ID de registro ou identificador de linha para cada linha na tabela. Então nossa tabela original fica assim:
(row id) a  b  c  d  e   
-------- -- -- -- -- --  
00000001 1  1  1  1  200 
00000002 1  1  1  1  300
00000003 1  2  1  1  200
00000004 1  3  1  1  200

Então, quando olhamos apenas para as 4 colunas de (a,b,c,d), estamos olhando também para o id da linha:
(row id) a  b  c  d 
-------- -- -- -- --
00000001 1  1  1  1
00000002 1  1  1  1
00000003 1  2  1  1
00000004 1  3  1  1

Mas queremos pesquisar por (a,b,c,d) e não por id de linha, então produzimos algo assim:
(a,b,c,d) (row id)
--------- --------
1,1,1,1   00000001
1,1,1,1   00000002
1,2,1,1   00000003
1,3,1,1   00000004

E, finalmente, agrupamos todos os IDs de linha de linhas que têm valores identicle (a,b,c,d) juntos:
(a,b,c,d) (row id)
--------- ---------------------
1,1,1,1   00000001 and 00000002
1,2,1,1   00000003
1,3,1,1   00000004

Vê isso? Os valores de (a,b,c,d), que são (1,1,1,1) (1,2,1,1) e (1,3,1,1) se tornaram chaves para nossa tabela de pesquisa nas linhas da tabela original.

Na verdade, nada disso realmente acontece, mas deve dar uma boa ideia de como uma implementação "ingênua" (ou seja, direta) de um índice pode ser feita.

Mas a linha inferior é esta:a cardinalidade apenas mede quantas linhas únicas existem em um índice. E em nosso exemplo esse era o número de chaves em nossa tabela de pesquisa, que era 3.

Espero que ajude!