Mysql
 sql >> Base de données >  >> RDS >> Mysql

Est-il judicieux d'utiliser un index qui aura une faible cardinalité ?

Un index peut être utile même sur des champs à faible cardinalité si :

  1. Lorsqu'une des valeurs possibles est très peu fréquente par rapport aux autres valeurs et que vous la recherchez.

    Par exemple, il y a très peu de femmes daltoniennes, donc cette requête :

    SELECT  *
    FROM    color_blind_people
    WHERE   gender = 'F'
    

    bénéficierait très probablement d'un index sur le gender .

  2. Lorsque les valeurs ont tendance à être regroupées dans l'ordre du tableau :

    SELECT  *
    FROM    records_from_2008
    WHERE   year = 2010
    LIMIT 1
    

    Bien qu'il n'y ait que 3 des années distinctes ici, les enregistrements avec des années antérieures sont très probablement ajoutés en premier, de sorte que de très nombreux enregistrements devraient être scannés avant de renvoyer le premier 2010 enregistrer sinon pour l'index.

  3. Lorsque vous avez besoin de ORDER BY / LIMIT :

    SELECT  *
    FROM    people
    ORDER BY
            gender, id
    LIMIT 1
    

    Sans l'index, un filesort serait nécessaire. Bien qu'il soit quelque peu optimisé, faites pour le LIMIT , il faudrait quand même une analyse complète de la table.

  4. Lorsque l'index couvre tous les champs utilisés dans la requête :

    CREATE INDEX (low_cardinality_record, value)
    
    SELECT  SUM(value)
    FROM    mytable
    WHERE   low_cardinality_record = 3
    
  5. Quand vous avez besoin de DISTINCT :

    SELECT  DISTINCT color
    FROM    tshirts
    

    MySQL utilisera INDEX FOR GROUP-BY , et si vous avez peu de couleurs, cette requête sera instantanée même avec des millions d'enregistrements.

    Ceci est un exemple de scénario où l'index sur un champ à faible cardinalité est plus efficace que sur un champ de cardinalité élevée.

Notez que si DML les performances ne sont pas très importantes sur un problème, alors vous pouvez créer l'index en toute sécurité.

Si l'optimiseur pense que l'index est inefficace, l'index ne sera tout simplement pas utilisé.