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

Indeksy MySQL - jakie są najlepsze praktyki?

Zdecydowanie powinieneś poświęcić trochę czasu na czytanie o indeksowaniu, dużo o tym napisano i ważne jest, aby zrozumieć, co się dzieje.

Ogólnie rzecz biorąc, indeks narzuca kolejność wierszom tabeli.

Dla uproszczenia wyobraź sobie, że tabela to tylko duży plik CSV. Za każdym razem, gdy wstawiany jest wiersz, jest on wstawiany na końcu . Tak więc „naturalna” kolejność w tabeli to tylko kolejność wstawiania wierszy.

Wyobraź sobie, że masz ten plik CSV załadowany w bardzo prymitywnym arkuszu kalkulacyjnym. Wszystko, co robi ten arkusz kalkulacyjny, to wyświetlanie danych i numerowanie wierszy w kolejności sekwencyjnej.

Teraz wyobraź sobie, że musisz znaleźć wszystkie wiersze, które mają jakąś wartość „M” w trzeciej kolumnie. Biorąc pod uwagę to, co masz dostępne, masz tylko jedną opcję. Przeszukujesz tabelę, sprawdzając wartość trzeciej kolumny dla każdego wiersza. Jeśli masz dużo wierszy, ta metoda ("skanowanie tabeli") może zająć dużo czasu!

Teraz wyobraź sobie, że oprócz tej tabeli masz indeks. Ten konkretny indeks jest indeksem wartości w trzeciej kolumnie. Indeks zawiera wszystkie wartości z trzeciej kolumny, w pewnym sensownym porządku (powiedzmy, alfabetycznie) i dla każdej z nich zawiera listę numerów wierszy, w których pojawia się ta wartość.

Teraz masz dobrą strategię wyszukiwania wszystkich wierszy, w których wartość trzeciej kolumny to „M”. Na przykład możesz wykonać wyszukiwanie binarne ! Podczas gdy skanowanie tabeli wymaga przeszukania N wierszy (gdzie N jest liczbą wierszy), wyszukiwanie binarne wymaga tylko spojrzenia na wpisy indeksu log-n, w najgorszym przypadku. Wow, to z pewnością o wiele łatwiejsze!

Oczywiście, jeśli masz ten indeks i dodajesz wiersze do tabeli (na końcu, ponieważ tak działa nasza tabela koncepcyjna), musisz za każdym razem aktualizować indeks. Więc wykonujesz trochę więcej pracy podczas pisania nowych wierszy, ale oszczędzasz mnóstwo czasu, gdy czegoś szukasz.

Ogólnie rzecz biorąc, indeksowanie tworzy kompromis między wydajnością odczytu a wydajnością zapisu. Bez indeksów wstawianie może być bardzo szybkie — silnik bazy danych po prostu dodaje wiersz do tabeli. Podczas dodawania indeksów silnik musi aktualizować każdy indeks podczas wstawiania.

Z drugiej strony odczyty stają się znacznie szybsze.

Mam nadzieję, że dotyczy to twoich dwóch pierwszych pytań (jak odpowiedzieli inni – musisz znaleźć odpowiednią równowagę).

Twój trzeci scenariusz jest trochę bardziej skomplikowany. Jeśli używasz LIKE, silniki indeksowania zazwyczaj pomagają w zwiększeniu szybkości odczytu do pierwszego „%”. Innymi słowy, jeśli wybierasz WHERE kolumnę LIKE 'foo%bar%', baza danych użyje indeksu, aby znaleźć wszystkie wiersze, w których kolumna zaczyna się od „foo”, a następnie będzie musiała przeskanować ten pośredni zestaw wierszy, aby znaleźć podzbiór który zawiera "bar". SELECT ... WHERE kolumna LIKE '%bar%' nie może używać indeksu. Mam nadzieję, że rozumiesz dlaczego.

Na koniec musisz zacząć myśleć o indeksach w więcej niż jednej kolumnie. Koncepcja jest taka sama i zachowuje się podobnie do rzeczy PODOBNYCH -- zasadniczo, jeśli masz indeks na (a,b,c), silnik będzie nadal używał indeksu od lewej do prawej, najlepiej jak potrafi. Zatem wyszukiwanie w kolumnie a może używać indeksu (a,b,c), podobnie jak w przypadku wyszukiwania w (a,b). Jednak silnik musiałby wykonać pełne skanowanie tabeli, jeśli szukałeś GDZIE b=5 AND c=1)

Mam nadzieję, że pomoże to rzucić trochę światła, ale muszę powtórzyć, że najlepiej spędzić kilka godzin na szukaniu dobrych artykułów, które szczegółowo wyjaśniają te rzeczy. Dobrym pomysłem jest również zapoznanie się z dokumentacją konkretnego serwera bazy danych. Sposób, w jaki indeksy są implementowane i używane przez planistów zapytań, mogą się bardzo różnić.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zamień na składnię zapytania

  2. Wstaw do wielu tabel w jednym zapytaniu

  3. Błąd MySQL składnia 1064, ale wszystko wydaje się w porządku

  4. Importowanie zi eksportowanie do plików za pomocą wiersza poleceń MySQL

  5. Wstaw klucz podstawowy automatycznego przyrostu do istniejącej tabeli