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

Ha senso usare un indice che avrà una cardinalità bassa?

Un indice può aiutare anche su campi a cardinalità bassa se:

  1. Quando uno dei valori possibili è molto raro rispetto agli altri valori e lo cerchi.

    Ad esempio, ci sono pochissime donne daltoniche, quindi questa query:

    SELECT  *
    FROM    color_blind_people
    WHERE   gender = 'F'
    

    molto probabilmente trarrebbero vantaggio da un indice su gender .

  2. Quando i valori tendono ad essere raggruppati nell'ordine della tabella:

    SELECT  *
    FROM    records_from_2008
    WHERE   year = 2010
    LIMIT 1
    

    Anche se ci sono solo 3 anni distinti qui, i record con anni precedenti molto probabilmente vengono aggiunti per primi, quindi moltissimi record dovrebbero essere scansionati prima di restituire il primo 2010 registra se non per l'indice.

  3. Quando hai bisogno di ORDER BY / LIMIT :

    SELECT  *
    FROM    people
    ORDER BY
            gender, id
    LIMIT 1
    

    Senza l'indice, un filesort sarebbe richiesto. Sebbene sia in qualche modo ottimizzato, fai il LIMIT , sarebbe comunque necessaria una scansione completa della tabella.

  4. Quando l'indice copre tutti i campi utilizzati nella query:

    CREATE INDEX (low_cardinality_record, value)
    
    SELECT  SUM(value)
    FROM    mytable
    WHERE   low_cardinality_record = 3
    
  5. Quando hai bisogno di DISTINCT :

    SELECT  DISTINCT color
    FROM    tshirts
    

    MySQL utilizzerà INDEX FOR GROUP-BY e se hai pochi colori, questa query sarà istantanea anche con milioni di record.

    Questo è un esempio di uno scenario in cui l'indice su un campo a cardinalità bassa è più efficiente di quello su un campo ad alta cardinalità.

Nota che se DML le prestazioni non sono molto importanti, quindi è possibile creare l'indice.

Se l'ottimizzatore ritiene che l'indice sia inefficiente, l'indice semplicemente non verrà utilizzato.