Ten wpis na blogu to druga część serii blogów o indeksach w MySQL. W pierwszej części serii wpisów na blogu o indeksach MySQL omówiliśmy wiele rzeczy, w tym czym one są, co robią, jakie są ich typy, jak wybrać optymalne typy danych oraz zestawy znaków MySQL dla używanych indeksów . Przeanalizowaliśmy zalety i wady używania indeksów w MySQL; powiedzieliśmy ci, jak wybrać najlepszy indeks do użycia, jak poprawić wydajność zapytań i upewnić się, że MySQL używa twoich indeksów, ile indeksów powinieneś mieć. Przeanalizowaliśmy również kilka kwestii związanych z silnikami pamięci masowej. W tym poście na blogu omówimy bardziej szczegółowo niektóre treści, które omówiliśmy w pierwszej części serii. Zaczniemy od korelacji między indeksami a silnikami pamięci masowej w MySQL.
Indeksy i silniki pamięci masowej w MySQL
Jak już wspomnieliśmy w poprzednim wpisie na blogu, mogą istnieć pewne rodzaje ograniczeń indeksów i innych rzeczy, jeśli używasz niektórych silników przechowywania w MySQL. Oto kilka z nich - teraz określimy, czym są niektóre z nich (niektóre z nich zostały omówione w pierwszej części serii blogów, więc jeśli czegoś nam brakuje, prawdopodobnie tam jest), a następnie omówimy je bardziej szczegółowo analiza:
-
Zgodnie z dokumentacją MySQL maksymalna liczba indeksów, maksymalna długość klucza i maksymalna długość indeksu to zdefiniowany na aparat pamięci masowej. Jak już wspomnieliśmy w poprzednim poście na blogu, maksymalna liczba indeksów na tabele MyISAM i InnoDB to 64, maksymalna liczba kolumn na indeks w obu silnikach pamięci masowej to 16, maksymalna długość klucza dla InnoDB to 3500 bajtów, a maksymalna długość klucza dla MyISAM wynosi 1000 bajtów.
-
Nie możesz użyć CREATE INDEX do utworzenia KLUCZU PODSTAWOWEGO — zamiast tego użyj ALTER TABLE.
-
Kolumny BLOB i TEXT mogą być indeksowane tylko dla tabel z silnikami pamięci masowej InnoDB, MyISAM i BLACKHOLE.
-
Jeśli indeksujesz tylko prefiks kolumny, pamiętaj, że obsługa prefiksów i ich długość są również zależne od silników magazynowych. Prefiks może mieć długość do 767 bajtów dla tabel InnoDB, które używają formatu wiersza REDUNDANT lub COMPACT, ale dla formatów wiersza DYNAMICZNEGO lub SKOMPRESOWANEGO limit długości prefiksu jest zwiększony do 3072 bajtów. W przypadku tabel MyISAM limit długości prefiksu wynosi 1000 bajtów. Silnik pamięci masowej NDB w ogóle nie obsługuje prefiksów.
-
Jeśli włączony jest ścisły tryb SQL, a prefiks indeksu przekracza maksymalny rozmiar typu danych kolumny, CREATE INDEX zgłasza błąd. Jeśli ścisły tryb SQL nie jest włączony, CREATE INDEX generuje ostrzeżenie. W przypadku utworzenia UNIKALNEGO INDEKSU pojawia się błąd.
-
Ogólnie rzecz biorąc, MySQL pozwala na utworzenie maksymalnie 16 indeksów w danej tabeli.
-
Jeśli używasz indeksu PRIMARY KEY, możesz mieć tylko jeden klucz podstawowy na tabelę. FULLTEXT, UNIQUE INDEX i INDEX nie mają tego ograniczenia.
-
Jeśli używasz indeksów FULLTEXT, pamiętaj, że można ich używać tylko w przypadku silników pamięci masowej InnoDB lub MyISAM oraz dla kolumn CHAR, VARCHAR lub TEXT. Należy również pamiętać, że MySQL używa indeksów FULLTEXT tylko wtedy, gdy używane są klauzule MATCH() AGAINST() i że w rzeczywistości można mieć indeks i indeks pełnotekstowy na tej samej kolumnie w tym samym czasie, jeśli sobie tego życzysz i że indeksy FULLTEXT mają swoje własny zestaw słów odrzucających, z których każdy jest specyficzny dla używanych silników pamięci masowej.
-
Indeksy B-Tree mogą być przydatne, jeśli używasz zapytań LIKE, które zaczynają się od symbolu wieloznacznego, ale tylko w niektórych scenariusze.
Znajomość tych ograniczeń indeksów powinna okazać się przydatna, jeśli próbujesz zrozumieć, jak działają indeksy w MySQL. Jeszcze ważniejsze jest jednak zrozumienie faktu, że musisz zweryfikować, czy Twoje indeksy są rzeczywiście używane przez MySQL. Poruszyliśmy to pokrótce w pierwszej części tej serii („Jak wybrać najlepszy indeks do użycia?”), ale nie powiedzieliśmy, jak sprawdzić, czy Twoje indeksy są rzeczywiście używane przez MySQL. Aby to zrobić, zweryfikuj ich użycie za pomocą EXPLAIN - gdy EXPLAIN jest używane razem z daną do wyjaśnienia instrukcją, MySQL wyświetla informacje z optymalizatora o planie wykonania instrukcji.
Klucze PODSTAWOWE
Niektóre z podstawowych kwestii związanych z indeksami PRIMARY KEY w MySQL obejmują fakt, że są one używane przede wszystkim do jednoznacznej identyfikacji rekordów w tabeli i są często używane z wartościami AUTO_INCREMENTing, co oznacza, że mogą być bardzo przydatne, jeśli tworzysz, powiedzmy, pola ID. Pola PRIMARY KEY muszą zawierać unikalne wartości i nie mogą zawierać wartości NULL.
Dopasowanie prefiksu kolumny
Indeksy mogą również odpowiadać przedrostkowi kolumny. Takie podejście do indeksów może być przydatne, jeśli Twoje kolumny są kolumnami łańcuchowymi i uważasz, że dodanie indeksu do całej kolumny potencjalnie zajęłoby dużo miejsca na dysku. Twoje indeksy mogą pasować do prefiksu kolumny, na przykład:
ALTER TABLE demo_table ADD INDEX index_name(column_name(length));
Powyższe zapytanie doda indeks nazwa_indeksu do kolumny o nazwie nazwa_kolumny tylko dla zdefiniowanego prefiksu kolumny. Aby wybrać odpowiednią ilość długości do indeksowania, upewnij się, że użycie prefiksu maksymalizuje niepowtarzalność wartości w kolumnie:znajdź liczbę wierszy w tabeli i oceniaj różne długości prefiksu, aż osiągniesz pożądaną unikatowość wierszy.
Pełnotekstowe indeksy w MySQL
Indeksy FULLTEXT w MySQL to zupełnie inna bestia. Mają wiele unikalnych dla siebie ograniczeń (na przykład InnoDB ma listę odrzucanych słów składającą się z 36 słów, podczas gdy lista odrzucanych słów MyISAM składa się z 143 słów), mają również unikalne tryby wyszukiwania. Niektóre z nich zawierają tryb języka naturalnego (aby aktywować taki tryb wyszukiwania, uruchom zapytanie FULLTEXT bez modyfikatorów), możesz również rozszerzyć wyszukiwanie (w tym celu użyj modyfikatora WITH QUERY EXPANSION - taki tryb wyszukiwania wykonuje wyszukaj dwa razy, ale gdy wyszukiwanie zostanie uruchomione po raz drugi, zawiera kilka najbardziej odpowiednich rekordów z pierwszego wyszukiwania - często używanego, gdy użytkownik ma sugerowaną wiedzę o czymś), aby wyszukiwać za pomocą operatorów logicznych użyj modyfikatora IN BOOLEAN MODE. Indeksy FULLTEXT będą również używane tylko wtedy, gdy zapytanie wyszukiwania składa się z co najmniej trzech znaków dla InnoDB i co najmniej czterech znaków dla MyISAM.
Korzystanie z indeksów B-Tree z symbolami wieloznacznymi
Indeksy są również często używane, jeśli budujesz coś podobnego do wyszukiwarek. W tym celu często chcesz wyszukać tylko część wartości i zwrócić wyniki — tutaj wkraczają symbole wieloznaczne. Proste zapytanie z symbolem wieloznacznym wykorzystuje zapytanie LIKE i znak %, aby oznaczyć „cokolwiek” po tekście. Na przykład takie zapytanie spowoduje wyszukanie wyników zaczynających się od słowa „szukaj” i mających cokolwiek po nim:
SELECT * FROM … WHERE demo_column LIKE ‘search%’;
Takie zapytanie wyszukiwałoby wyniki zaczynające się od czegokolwiek, zawierające słowo „szukaj” i zawierające cokolwiek po nim:
SELECT * FROM … WHERE demo_column LIKE ‘%search%’;
Ale tu jest haczyk — powyższe zapytanie nie użyje indeksu. Czemu? Ponieważ ma na początku symbol wieloznaczny, a MySQL nie może określić, od czego powinna zacząć się kolumna. Dlatego powiedzieliśmy, że indeksy z symbolami wieloznacznymi mają swoje miejsce, ale tylko w określonych sytuacjach – to znaczy takich, w których nie ma symbolu wieloznacznego na początku zapytania.
Korzystanie z ClusterControl do monitorowania wydajności zapytań
Oprócz używania EXPLAIN, możesz również użyć ClusterControl do monitorowania wydajności zapytań:ClusterControl zapewnia zestaw zaawansowanych funkcji monitorowania i raportowania, które pozwalają śledzić wydajność instancji bazy danych i zapytań . Na przykład kliknij klaster, a zobaczysz kartę „Monitor zapytań”. Kliknij go, a ClusterControl pozwoli Ci obserwować stan zapytań w instancjach bazy danych:
Ta część ClusterControl pozwala wyświetlić listę najwolniejszych i najdłuższych uruchamianie zapytań, jednocześnie umożliwiając ich filtrowanie. Na przykład, jeśli wiesz, że niedawno uruchomiłeś zapytanie składające się z @@log_bin, możesz po prostu wyszukać termin, a ClusterControl zwróci listę wyników:
Jak zapewne zauważyłeś, możesz także filtrować zapytania według używanych hostów lub według wystąpień, możesz również wybrać zestaw wierszy, na przykład 20, 100 lub 200. ClusterControl poinformuje Cię również, kiedy zapytanie było ostatnio widziane, jaki był jego całkowity czas wykonania, ile wierszy zwróciło, ile wierszy zbadał i tak dalej. ClusterControl może okazać się pomocny, jeśli chcesz obserwować, w jaki sposób Twoje indeksy są faktycznie wykorzystywane przez instancje MySQL, MariaDB, MongoDB, PostgreSQL lub TimescaleDB.
Podsumowanie
W tym poście na blogu omówiliśmy pewne ograniczenia i korzyści dotyczące indeksów w MySQL, a także omówiliśmy, w jaki sposób ClusterControl może pomóc w osiągnięciu celów związanych z wydajnością bazy danych. Będziemy mieli również trzecią część o indeksach w MySQL, zagłębiając się w nie jeszcze głębiej, ale podsumowując to, co omówiliśmy do tej pory, pamiętaj, że indeksy w MySQL z pewnością mają swoje własne miejsce - aby jak najlepiej je wykorzystać, wiedz w jaki sposób współdziałają z silnikami pamięci masowej, jakie są ich zalety i ograniczenia, jak i kiedy używać określonych typów indeksów i dokonywać mądrego wyboru.