Mysql
 sql >> Database >  >> RDS >> Mysql

Perché la cardinalità di un indice in MySQL rimane invariata quando aggiungo un nuovo indice?

Se hai solo 1 riga nella tabella, la cardinalità per l'indice dovrebbe essere 1, ovviamente. Sta solo contando il numero di valori univoci.

Se pensi a un indice come a una tabella di ricerca basata su bucket (come un hash), la cardinalità è il numero di bucket.

Ecco come funziona:quando crei un indice su un insieme di colonne (a,b,c,d) , quindi il database esamina tutte le righe della tabella, osservando le quadruple ordinate di quelle 4 colonne, per ciascuna riga. Supponiamo che la tua tabella sia simile a questa:

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

Quindi ciò che il database esamina sono solo le 4 colonne (a,b,c,d):

a  b  c  d  
-- -- -- --
1  1  1  1 
1  2  1  1 
1  3  1  1 

Vedi che sono rimaste solo 3 righe uniche? Quelli diventeranno i nostri secchi, ma ci torneremo. In realtà, c'è anche un ID record o un identificatore di riga per ogni riga della tabella. Quindi il nostro tavolo originale si presenta così:

(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

Quindi, quando guardiamo solo le 4 colonne di (a,b,c,d), stiamo davvero guardando anche l'id della riga:

(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

Ma vogliamo cercare per (a,b,c,d) e non per ID riga, quindi produciamo qualcosa del genere:

(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

Infine, raggruppiamo tutti gli ID di riga delle righe che hanno valori identiche (a,b,c,d):

(a,b,c,d) (row id)
--------- ---------------------
1,1,1,1   00000001 and 00000002
1,2,1,1   00000003
1,3,1,1   00000004

Guarda quello? I valori di (a,b,c,d), che sono (1,1,1,1) (1,2,1,1) e (1,3,1,1) sono diventati chiavi per la nostra tabella di ricerca nelle righe della tabella originale.

In realtà, niente di tutto ciò accade davvero, ma dovrebbe darti una buona idea su come potrebbe essere eseguita un'implementazione "ingenua" (cioè diretta) di un indice.

Ma la linea di fondo è questa:la cardinalità misura solo quante righe univoche ci sono in un indice. E nel nostro esempio quello era il numero di chiavi nella nostra tabella di ricerca, che era 3.

Spero di esserti stato d'aiuto!