sql >> Database >  >> RDS >> Mysql

Waarom blijft de kardinaliteit van een index in MySQL ongewijzigd als ik een nieuwe index toevoeg?

Als je maar 1 rij in de tabel hebt, moet de kardinaliteit voor de index natuurlijk 1 zijn. Het telt gewoon het aantal unieke waarden.

Als je een index ziet als een opzoektabel op basis van buckets (zoals een hash), dan is de kardinaliteit het aantal buckets.

Zo werkt het:wanneer u een index opbouwt over een reeks kolommen (a,b,c,d) , dan gaat de database over alle rijen in de tabel, kijkend naar de geordende viervoud van die 4 kolommen, voor elke rij. Stel dat uw tabel er als volgt uitziet:

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

Dus waar de database naar kijkt zijn alleen de 4 kolommen (a,b,c,d):

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

Zie je dat er nog maar 3 unieke rijen over zijn? Dat worden onze emmers, maar daar komen we op terug. In werkelijkheid is er ook een record-ID of rij-ID voor elke rij in de tabel. Dus onze originele tabel ziet er als volgt uit:

(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

Dus als we alleen naar de 4 kolommen van (a,b,c,d) kijken, kijken we ook echt naar de rij-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

Maar we willen opzoeken op (a,b,c,d) en niet op rij-ID, dus we produceren zoiets als dit:

(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

En tot slot groeperen we alle rij-ID's van rijen die identieke (a,b,c,d)-waarden hebben:

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

Zie dat? De waarden van (a,b,c,d), die (1,1,1,1) (1,2,1,1) en (1,3,1,1) zijn, zijn sleutels geworden voor onze opzoektabel in de rijen van de originele tabel.

Eigenlijk gebeurt dit allemaal niet, maar het zou u een goed idee moeten geven van hoe een "naïeve" (d.w.z. ongecompliceerde) implementatie van een index zou kunnen worden gedaan.

Maar de bottom line is dit:kardinaliteit meet gewoon hoeveel unieke rijen er in een index zijn. En in ons voorbeeld was dat het aantal sleutels in onze opzoektabel, dat was 3.

Ik hoop dat dat helpt!



  1. UNION ALL-optimalisatie

  2. Prestatiebewaking en -audit PostgreSQL - Topbronnen

  3. Prestatielimieten van oplossingen voor logische replicatie

  4. Selecteer MAX of Bestel op limiet 1