Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Ist es sinnvoll, einen Index mit niedriger Kardinalität zu verwenden?

Ein Index kann auch bei Feldern mit niedriger Kardinalität hilfreich sein, wenn:

  1. Wenn einer der möglichen Werte im Vergleich zu den anderen Werten sehr selten vorkommt und Sie danach suchen.

    Zum Beispiel gibt es sehr wenige farbenblinde Frauen, also diese Abfrage:

    SELECT  *
    FROM    color_blind_people
    WHERE   gender = 'F'
    

    würde höchstwahrscheinlich von einem Index zu gender profitieren .

  2. Wenn die Werte in der Regel in der Tabellenreihenfolge gruppiert sind:

    SELECT  *
    FROM    records_from_2008
    WHERE   year = 2010
    LIMIT 1
    

    Obwohl es nur 3 sind Hier werden Datensätze mit früheren Jahren höchstwahrscheinlich zuerst hinzugefügt, so dass sehr viele Datensätze gescannt werden müssten, bevor der erste 2010 zurückgegeben wird Rekord wenn nicht für den Index.

  3. Wenn Sie ORDER BY / LIMIT benötigen :

    SELECT  *
    FROM    people
    ORDER BY
            gender, id
    LIMIT 1
    

    Ohne den Index ein filesort erforderlich wäre. Obwohl es etwas optimiert ist, tun Sie das LIMIT , es wäre immer noch ein vollständiger Tabellenscan erforderlich.

  4. Wenn der Index alle in der Abfrage verwendeten Felder abdeckt:

    CREATE INDEX (low_cardinality_record, value)
    
    SELECT  SUM(value)
    FROM    mytable
    WHERE   low_cardinality_record = 3
    
  5. Wenn Sie DISTINCT benötigen :

    SELECT  DISTINCT color
    FROM    tshirts
    

    MySQL verwendet INDEX FOR GROUP-BY , und wenn Sie nur wenige Farben haben, wird diese Abfrage auch bei Millionen von Datensätzen sofort ausgeführt.

    Dies ist ein Beispiel für ein Szenario, in dem der Index für ein Feld mit niedriger Kardinalität mehr ist effizienter als auf einem Feld mit hoher Kardinalität.

Beachten Sie, dass wenn DML Leistung ist nicht viel auf ein Problem, dann ist es sicher, den Index zu erstellen.

Wenn der Optimierer denkt, dass der Index ineffizient ist, wird der Index einfach nicht verwendet.