sql >> Database >  >> RDS >> Mysql

Heeft het zin om een ​​index te gebruiken die een lage kardinaliteit heeft?

Een index kan zelfs helpen bij velden met een lage kardinaliteit als:

  1. Wanneer een van de mogelijke waarden zeer zeldzaam is in vergelijking met de andere waarden en u zoekt ernaar.

    Er zijn bijvoorbeeld maar heel weinig kleurenblinde vrouwen, dus deze vraag:

    SELECT  *
    FROM    color_blind_people
    WHERE   gender = 'F'
    

    zou hoogstwaarschijnlijk baat hebben bij een index op gender .

  2. Wanneer de waarden de neiging hebben om in de tabelvolgorde te worden gegroepeerd:

    SELECT  *
    FROM    records_from_2008
    WHERE   year = 2010
    LIMIT 1
    

    Hoewel er maar 3 . zijn verschillende jaren hier, records met eerdere jaren worden hoogstwaarschijnlijk eerst toegevoegd, dus heel veel records zouden moeten worden gescand voordat de eerste 2010 wordt geretourneerd opnemen indien niet voor de index.

  3. Wanneer u ORDER BY / LIMIT nodig heeft :

    SELECT  *
    FROM    people
    ORDER BY
            gender, id
    LIMIT 1
    

    Zonder de index, een filesort vereist zou zijn. Hoewel het enigszins geoptimaliseerd is voor de LIMIT , zou het nog steeds een volledige tafelscan nodig hebben.

  4. Wanneer de index alle velden bedekt die in de zoekopdracht worden gebruikt:

    CREATE INDEX (low_cardinality_record, value)
    
    SELECT  SUM(value)
    FROM    mytable
    WHERE   low_cardinality_record = 3
    
  5. Wanneer u DISTINCT nodig heeft :

    SELECT  DISTINCT color
    FROM    tshirts
    

    MySQL gebruikt INDEX FOR GROUP-BY , en als u weinig kleuren heeft, is deze zoekopdracht direct beschikbaar, zelfs bij miljoenen records.

    Dit is een voorbeeld van een scenario waarin de index op een veld met een lage kardinaliteit meer is efficiënter dan dat op een veld met hoge kardinaliteit.

Merk op dat als DML prestatie is niet zo belangrijk, dan is het veilig om de index te maken.

Als de optimizer denkt dat de index inefficiënt is, wordt de index gewoon niet gebruikt.



  1. Hoe de SQL IN-clausule op te maken met Python

  2. Postgres:beperking toevoegen als deze nog niet bestaat

  3. Haal rijen gegroepeerd op uur op met MySQL

  4. Een inleiding tot tijdreeksdatabases