sql >> Databasteknik >  >> RDS >> Mysql

Varför förblir kardinaliteten för ett index i MySQL oförändrad när jag lägger till ett nytt index?

Om du bara har 1 rad i tabellen ska kardinaliteten för indexet vara 1, förstås. Det är bara att räkna antalet unika värden.

Om du tänker på ett index som en uppslagstabell baserad på hinkar (som en hash), så är kardinaliteten antalet hinkar.

Så här fungerar det:När du bygger ett index över en uppsättning kolumner (a,b,c,d) , sedan går databasen över alla rader i tabellen och tittar på de ordnade fyrlingarna av dessa 4 kolumner, för varje rad. Låt oss säga att ditt bord ser ut så här:

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

Så vad databasen tittar på är bara de fyra kolumnerna (a,b,c,d):

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

Ser du att det bara finns 3 unika rader kvar? De kommer att bli våra hinkar, men vi återkommer till det. I verkligheten finns det också ett post-ID eller radidentifierare för varje rad i tabellen. Så vår ursprungliga tabell ser ut så här:

(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

Så när vi bara tittar på de fyra kolumnerna i (a,b,c,d), tittar vi verkligen också på rad-id:

(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

Men vi vill göra uppslag efter (a,b,c,d) och inte efter rad-id, så vi producerar något så här:

(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

Och slutligen grupperar vi alla rad-ID för rader som har identiska (a,b,c,d) värden tillsammans:

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

Se det? Värdena för (a,b,c,d), som är (1,1,1,1) (1,2,1,1) och (1,3,1,1) har blivit nycklar för vår uppslagstabell i raderna i den ursprungliga tabellen.

Egentligen händer inget av detta, men det borde ge dig en god uppfattning om hur en "naiv" (dvs. rakt fram) implementering av ett index kan göras.

Men slutsatsen är denna:kardinalitet mäter bara hur många unika rader det finns i ett index. Och i vårt exempel var det antalet nycklar i vår uppslagstabell, vilket var 3.

Hoppas det hjälper!



  1. Infoga array i MySQL-databas med PHP

  2. Hur snabbar man upp antalet valda(*) med grupp efter och var?

  3. SQL TABELL

  4. Relation existerar inte