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

Hvorfor forbliver kardinaliteten af ​​et indeks i MySQL uændret, når jeg tilføjer et nyt indeks?

Hvis du kun har 1 række i tabellen, skal kardinaliteten for indekset selvfølgelig være 1. Det tæller bare antallet af unikke værdier.

Hvis du tænker på et indeks som en opslagstabel baseret på buckets (som en hash), så er kardinaliteten antallet af buckets.

Sådan fungerer det:Når du bygger et indeks over et sæt kolonner (a,b,c,d) , så gennemgår databasen alle rækkerne i tabellen og ser på de ordnede firlinger af disse 4 kolonner for hver række. Lad os sige, at dit bord ser sådan ud:

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å hvad databasen ser på er kun de 4 kolonner (a,b,c,d):

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

Kan du se, at der kun er 3 unikke rækker tilbage? De bliver vores spande, men det vender vi tilbage til. I virkeligheden er der også et post-id eller række-id for hver række i tabellen. Så vores originale tabel ser således ud:

(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 kun ser på de 4 kolonner i (a,b,c,d), ser vi virkelig også på række-id'et:

(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 ønsker at lave opslag efter (a,b,c,d) og ikke efter række-id, så vi producerer noget som dette:

(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

Og til sidst grupperer vi alle række-id'erne for rækker, der har identiske (a,b,c,d) værdier:

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

Kan du se det? Værdierne af (a,b,c,d), som er (1,1,1,1) (1,2,1,1) og (1,3,1,1) er blevet nøgler til vores opslagstabel ind i rækkerne i den oprindelige tabel.

Faktisk sker der ikke rigtig noget af dette, men det burde give dig en god idé om, hvordan en "naiv" (dvs. ligetil) implementering af et indeks kan udføres.

Men bundlinjen er denne:kardinalitet måler bare, hvor mange unikke rækker der er i et indeks. Og i vores eksempel var det antallet af nøgler i vores opslagstabel, som var 3.

Håber det hjælper!



  1. MySQL:Sådan bulker du SELECT rækker med flere par i WHERE-klausulen

  2. Fuldtekst søgerelevans måles i?

  3. FEJL:Indlæsning af lokale data er deaktiveret - dette skal være aktiveret på både klient- og serversiden

  4. Vælg en værdi fra en gruppe baseret på rækkefølge fra andre kolonner