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

MySQL-indekskardinalitet - ydeevne vs lagereffektivitet

Højere kardinalitet betyder bedre læseydelse, fordi der per definition er færre poster at læse.

Sådan behandler du en forespørgsel som denne:

SELECT  *
FROM    mytable
WHERE   indexed_col = @myvalue

, bør motoren udføre følgende trin:

  1. Find den første post, der opfylder betingelsen.

    Dette gøres ved at krydse B-Tree , startende fra rodposten.

    På tværs af siderne udføres søgningen ved at følge B-Tree links; inden for en side udføres søgningen ved hjælp af binær søgning (medmindre dine nøgler er komprimerede, i hvilket tilfælde det er en lineær søgning).

    Denne algoritme samme effektivitet for kolonner med høj kardinalitet og lav kardinalitet. At finde den første 3 (i modsætning til enhver 3 ) i disse lister:

    1  2  3  4  5  6  7  8  9  10
    
    3  3  3  3  3  3  3  3  4  4
    

    kræver samme O(log(n)) trin.

  2. Gennemgang af indekset, indtil nøgleværdien ændres. Dette kræver selvfølgelig lineær tid:Jo flere poster du har, jo mere skal du krydse.

Hvis du kun har brug for den første post:

SELECT  *
FROM    mytable
WHERE   indexed_col = @myvalue
LIMIT 1

, kolonnens kardinalitet påvirker ikke læseydelsen.

Hver indeksnøgle har en skjult ekstra værdi:en registreringsmarkør. Dette er hele pointen med at have et indeks:du skal vide, hvilken post den peger på.

Da en registreringsmarkør per definition er unik, er hver indeksnøgle også unik. Indeksposterne, der deler den samme nøgleværdi, sorteres efter postmarkøren.

Dette er for at gøre indekset vedligeholdeligt:​​Hvis du sletter en post med værdien af ​​en indekseret kolonne, der deles af en million af andre poster, skal den tilsvarende indekspost også slettes. Men hele millionen af ​​indeksposterne bliver ikke kigget igennem:I stedet bruges postmarkøren som en ekstra søgebetingelse.

Hver indeksnøgle er faktisk unik (selvom du ikke definerer indekset som unikt), og har derfor maksimalt mulig kardinalitet.

Så svaret på dine spørgsmål er:nej, kolonnens kardinalitet påvirker ikke indeksskriveydelsen.




  1. MySQLSyntaxErrorException i nærheden af ​​? når du forsøger at udføre PreparedStatement

  2. SQL Server:Find ud af standardværdien af ​​en kolonne med en forespørgsel

  3. SQL-serverunion, men hold orden

  4. Inkrementel datareplikering i IRI Workbench