sql >> Databasteknik >  >> RDS >> Mysql

MySQL-indexkardinalitet - prestanda kontra lagringseffektivitet

Högre kardinalitet betyder bättre läsprestanda eftersom det per definition finns färre poster att läsa.

För att bearbeta en fråga som denna:

SELECT  *
FROM    mytable
WHERE   indexed_col = @myvalue

, bör motorn utföra följande steg:

  1. Hitta den första posten som uppfyller villkoret.

    Detta görs genom att korsa B-Tree , med början från rotposten.

    På alla sidorna utförs sökningen genom att följa B-Tree länkar; på en sida utförs sökningen med binär sökning (såvida inte dina nycklar är komprimerade, i så fall är det en linjär sökning).

    Denna algoritm har samma effektivitet för kolumner med hög kardinalitet och låg kardinalitet. Hitta den första 3 (i motsats till någon 3 ) i dessa listor:

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

    kräver samma O(log(n)) steg.

  2. Gå igenom indexet tills nyckelvärdet ändras. Detta kräver naturligtvis linjär tid:ju fler poster du har, desto mer behöver du korsa.

Om du bara behöver den första posten:

SELECT  *
FROM    mytable
WHERE   indexed_col = @myvalue
LIMIT 1

, kolumnkardinalitet påverkar inte läsprestanda.

Varje indexnyckel har ett dolt tilläggsvärde:en postpekare. Det här är hela poängen med att ha ett index:du måste veta vilken post den pekar på.

Eftersom en postpekare per definition är unik, är varje indexnyckel också unik. Indexposterna som delar samma nyckelvärde sorteras efter postpekaren.

Detta för att göra indexet underhållbart:om du tar bort en post med värdet av en indexerad kolumn som delas av en miljon andra poster, bör motsvarande indexpost också tas bort. Men hela miljonen av indexposterna tittas inte igenom:i stället används postpekaren som ett ytterligare sökvillkor.

Varje indexnyckel är i själva verket unik (även om du inte definierar indexet som unikt), och har därför maximal kardinalitet.

Så svaret på dina frågor är:nej, kolumnkardinaliteten påverkar inte indexskrivprestandan.




  1. Flera databas och transaktioner

  2. Fördelar med att lära sig nya DB-system

  3. Hur man förbättrar MySQL AWS-prestanda 2X över Amazon RDS till samma kostnad

  4. Olaglig blandning av sammanställningar (utf8mb4_unicode_ci,IMPLICIT) och (utf8mb4_general_ci,IMPLICIT) för operation '='