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

Kardynalność indeksu MySQL — wydajność vs wydajność pamięci masowej

Większa kardynalność oznacza lepszą wydajność odczytu, ponieważ z definicji jest mniej rekordów do odczytania.

Aby przetworzyć zapytanie w ten sposób:

SELECT  *
FROM    mytable
WHERE   indexed_col = @myvalue

, silnik powinien wykonać następujące czynności:

  1. Znajdź pierwszy wpis spełniający warunek.

    Odbywa się to przechodząc przez B-Tree , zaczynając od wpisu głównego.

    Na wszystkich stronach wyszukiwanie odbywa się za pomocą B-Tree spinki do mankietów; w obrębie strony wyszukiwanie odbywa się za pomocą wyszukiwania binarnego (chyba że klucze są skompresowane, w takim przypadku jest to wyszukiwanie liniowe).

    Ten algorytm ma taką samą wydajność dla kolumn o wysokiej kardynalności i niskiej kardynalności. Znajdowanie pierwszych 3 (w przeciwieństwie do 3 ) na tych listach:

    1  2  3  4  5  6  7  8  9  10
    
    3  3  3  3  3  3  3  3  4  4
    

    wymaga tego samego O(log(n)) kroki.

  2. Przemierzanie indeksu aż do zmiany wartości klucza. To oczywiście wymaga czasu liniowego:im więcej masz rekordów, tym więcej musisz przebyć.

Jeśli potrzebujesz tylko pierwszego rekordu:

SELECT  *
FROM    mytable
WHERE   indexed_col = @myvalue
LIMIT 1

, kardynalność kolumny nie wpływa na wydajność odczytu.

Każdy klucz indeksu ma ukrytą wartość dodatkową:wskaźnik rekordu. To jest cały sens posiadania indeksu:musisz wiedzieć, na który rekord on wskazuje.

Ponieważ wskaźnik rekordu z definicji jest unikalny, każdy klucz indeksu jest również unikalny. Wpisy indeksu o tej samej wartości klucza są sortowane według wskaźnika rekordu.

Ma to na celu umożliwienie konserwacji indeksu:jeśli usuniesz rekord z wartością zindeksowanej kolumny współdzielonej przez milion innych rekordów, odpowiedni rekord indeksu również powinien zostać usunięty. Ale cały milion rekordów indeksu nie jest przeglądany:zamiast tego wskaźnik rekordu jest używany jako dodatkowy warunek wyszukiwania.

Każdy klucz indeksu jest w rzeczywistości unikalny (nawet jeśli nie zdefiniujesz indeksu jako unikalnego), a zatem ma maksymalną możliwą kardynalność.

Odpowiedź na twoje pytania brzmi:nie, kardynalność kolumn nie wpływa na wydajność zapisu indeksu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Eksportuj bazę danych z MySQL Workbench z instrukcjami INSERT

  2. Jak wyeksportować dane z SQL Server 2005 do MySQL

  3. O kursorze i iteratorze mysql

  4. Czy `mysqlcheck` może pomóc mi rozwiązać problemy z bazą danych bez uszkadzania mojej bazy danych?

  5. Python:MySQLdb i biblioteka nie zostały załadowane:libmysqlclient.16.dylib