sql >> Databasteknik >  >> RDS >> Mysql

Är det vettigt att använda ett index som kommer att ha en låg kardinalitet?

Ett index kan hjälpa även på fält med låg kardinalitet om:

  1. När ett av möjliga värden är mycket sällsynt jämfört med de andra värdena och du söker efter det.

    Till exempel finns det väldigt få färgblinda kvinnor, så den här frågan:

    SELECT  *
    FROM    color_blind_people
    WHERE   gender = 'F'
    

    skulle med största sannolikhet dra nytta av ett index på gender .

  2. När värdena tenderar att grupperas i tabellordning:

    SELECT  *
    FROM    records_from_2008
    WHERE   year = 2010
    LIMIT 1
    

    Även om det bara finns 3 distinkta år här, poster med tidigare år läggs troligen till först så väldigt många poster skulle behöva skannas innan den första 2010 returneras spela in om inte för indexet.

  3. När du behöver ORDER BY / LIMIT :

    SELECT  *
    FROM    people
    ORDER BY
            gender, id
    LIMIT 1
    

    Utan index, en filesort skulle krävas. Även om det är något optimerat för LIMIT , det skulle fortfarande behöva en fullständig tabellskanning.

  4. När indexet täcker alla fält som används i frågan:

    CREATE INDEX (low_cardinality_record, value)
    
    SELECT  SUM(value)
    FROM    mytable
    WHERE   low_cardinality_record = 3
    
  5. När du behöver DISTINCT :

    SELECT  DISTINCT color
    FROM    tshirts
    

    MySQL kommer att använda INDEX FOR GROUP-BY , och om du har få färger kommer denna fråga att vara omedelbar även med miljontals poster.

    Detta är ett exempel på ett scenario när indexet på ett fält med låg kardinalitet är mer effektivare än så på ett fält med hög kardinalitet.

Observera att om DML prestanda är inte mycket på ett problem, då är det säkert att skapa indexet.

Om optimeraren anser att indexet är ineffektivt, kommer indexet helt enkelt inte att användas.



  1. MYSQL Dumpa endast vissa rader

  2. SQL Server 2016 – Introduktion till Stretch Database

  3. Konvertering av Python DateTime-sträng till heltals millisekunder

  4. SQL*Plus hur accepterar man textvariabel från prompt?