Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Czy ma sens używanie indeksu, który będzie miał niską kardynalność?

Indeks może pomóc nawet w przypadku pól o niskiej kardynalności, jeśli:

  1. Gdy jedna z możliwych wartości jest bardzo rzadka w porównaniu z innymi wartościami i szukasz jej.

    Na przykład jest bardzo niewiele kobiet nierozróżniających kolorów, więc to zapytanie:

    SELECT  *
    FROM    color_blind_people
    WHERE   gender = 'F'
    

    najprawdopodobniej skorzystałby z indeksu gender .

  2. Gdy wartości mają tendencję do grupowania w kolejności tabeli:

    SELECT  *
    FROM    records_from_2008
    WHERE   year = 2010
    LIMIT 1
    

    Chociaż jest tylko 3 tutaj odrębne lata, rekordy z wcześniejszymi latami są najprawdopodobniej dodawane jako pierwsze, więc bardzo wiele rekordów musiałoby zostać zeskanowanych przed zwróceniem pierwszego 2010 zapis, jeśli nie dla indeksu.

  3. Kiedy potrzebujesz ORDER BY / LIMIT :

    SELECT  *
    FROM    people
    ORDER BY
            gender, id
    LIMIT 1
    

    Bez indeksu filesort byłoby wymagane. Chociaż jest to nieco zoptymalizowane, wykonaj LIMIT , nadal wymagałoby pełnego skanowania tabeli.

  4. Gdy indeks obejmuje wszystkie pola użyte w zapytaniu:

    CREATE INDEX (low_cardinality_record, value)
    
    SELECT  SUM(value)
    FROM    mytable
    WHERE   low_cardinality_record = 3
    
  5. Kiedy potrzebujesz DISTINCT :

    SELECT  DISTINCT color
    FROM    tshirts
    

    MySQL użyje INDEX FOR GROUP-BY , a jeśli masz kilka kolorów, to zapytanie będzie natychmiastowe nawet przy milionach rekordów.

    To jest przykład scenariusza, w którym indeks w polu o niskiej liczności to więcej wydajniejsze niż na polu o wysokiej kardynalności.

Zwróć uwagę, że jeśli DML wydajność nie ma większego znaczenia, więc można bezpiecznie utworzyć indeks.

Jeśli optymalizator uzna, że ​​indeks jest nieefektywny, indeks po prostu nie zostanie użyty.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rozwiązywanie problemów:MySQL/MariaDB Błąd #1044 i #1045 Odmowa dostępu dla użytkownika

  2. Czy MySQL FIND_IN_SET lub odpowiednik może używać indeksów?

  3. Przywróć bazę danych MySQL ze znakami Unicode (arabskimi i kurdyjskimi) w formacie .gz

  4. Uruchom, aby po cichu zignorować / usunąć zduplikowane wpisy na INSERT

  5. Django:sqlite dla dewelopera, mysql dla prod?