MySQL Indeks: Samouczek tworzenia, dodawania i upuszczania
โก Inteligentne podsumowanie
MySQL Samouczek dotyczฤ cy indeksรณw pokazuje, jak indeksy szybko sortujฤ i lokalizujฤ dane. Indeks to posortowana struktura wyszukiwania utworzona na podstawie jednej lub kilku kolumn; polecenie CREATE INDEX dodaje indeks, polecenie SHOW INDEXES go sprawdza, a polecenie DROP INDEX usuwa go, gdy obciฤ ลผenie tabel duลผฤ liczbฤ operacji zapisu przewaลผa nad korzyลciami z odczytu.

Czym sฤ sterowniki MySQL Indeks?
An wskaลบnik in MySQL to struktura danych, ktรณra przechowuje wartoลci kolumn w uporzฤ dkowany sposรณb, dziฤki czemu wyszukiwarka moลผe szybko wyszukiwaฤ wiersze. Indeksy sฤ tworzone na podstawie kolumny lub kolumn najczฤลciej uลผywanych do filtrowania danych. Wyobraลบ sobie indeks jak listฤ posortowanฤ alfabetycznie: znalezienie nazwy na liลcie posortowanej jest znacznie szybsze niลผ w niesortowanym stosie.
Indeksy wiฤ ลผฤ siฤ z pewnym kompromisem โ kaลผda instrukcja INSERT lub UPDATE musi utrzymywaฤ indeks, wiฤc dodanie zbyt wielu indeksรณw do tabeli z duลผฤ liczbฤ zapisรณw moลผe negatywnie wpลynฤ ฤ na ogรณlnฤ wydajnoลฤ. Zasadniczo kolumny indeksรณw, ktรณre pojawiajฤ siฤ w klauzulach WHERE, JOIN i ORDER BY w tabelach, sฤ odczytywane czฤลciej niลผ zapisywane.
Dlaczego warto uลผywaฤ indeksu?
Nikt nie lubi powolnych systemรณw. Wysoka wydajnoลฤ jest priorytetem dla niemal kaลผdej aplikacji opartej na bazie danych. Firmy inwestujฤ ogromne sumy w sprzฤt, aby zapewniฤ szybkoลฤ zapytaล, ale moลผliwoลci samego sprzฤtu sฤ ograniczone. Optymalizacja indeksรณw to taลsze i skuteczniejsze rozwiฤ zanie.
Dลugie czasy reakcji wynikajฤ zazwyczaj z przechowywania wierszy w kolejnoลci fizycznej na dysku. Bez indeksu, MySQL musi przeskanowaฤ kaลผdy wiersz, aby znaleลบฤ te, ktรณre pasujฤ do predykatu โ โpeลne skanowanie tabeliโ. Indeksy pozwalajฤ MySQL przejdลบ bezpoลrednio do pasujฤ cych wierszy, co zmienia plan zapytania z O(n) na mniej wiฤcej O(log n) w przypadku wyszukiwaล w drzewie B.
Skลadnia: Utwรณrz indeks
Indeks moลผna zdefiniowaฤ w dwรณch miejscach:
- W momencie tworzenia tabeli.
- Po tym jak tabela juลผ istnieje.
Przykลad: Utwรณrz indeks wbudowany za pomocฤ polecenia CREATE TABLE
Dla myflixdb W bazie danych spodziewamy siฤ wielu wyszukiwaล w kolumnie z peลnym imieniem i nazwiskiem. Poniลผszy skrypt tworzy nowฤ
members_indexed tabela z indeksem na full_names Kolumna.
CREATE TABLE `members_indexed` (
`membership_number` INT(11) NOT NULL AUTO_INCREMENT,
`full_names` VARCHAR(150) DEFAULT NULL,
`gender` VARCHAR(6) DEFAULT NULL,
`date_of_birth` DATE DEFAULT NULL,
`physical_address` VARCHAR(255) DEFAULT NULL,
`postal_address` VARCHAR(255) DEFAULT NULL,
`contact_number` VARCHAR(75) DEFAULT NULL,
`email` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`membership_number`),
INDEX (`full_names`)
) ENGINE = InnoDB;
Wykonaj skrypt w MySQL Stรณล warsztatowy przeciwko myflixdb Baza danych.
Odลwieลผ kod myflixdb zobaczyฤ nowe members_indexed tabela. The full_names kolumna teraz pojawia siฤ pod Indeksy wฤzeล.
W miarฤ wzrostu liczby czลonkรณw, zapytania wyszukiwania na temat members_indexed ktรณre uลผywajฤ
WHERE i ORDER BY full_names sฤ
znacznie szybsze niลผ te same zapytania w oryginale members tabela bez indeksu.
Dodaj indeks po utworzeniu tabeli
Czฤsto odkryjesz, ลผe istniejฤ
ca tabela potrzebuje indeksu โ zapytania wyszukiwania sฤ
powolne, a plan EXPLAIN pokazuje peลne skanowanie tabeli w kolumnie, ktรณra pojawia siฤ w WHERE. CREATE INDEX Polecenie dodaje indeks bez ponownego tworzenia tabeli.
CREATE INDEX `id_index` ON `table_name` (`column_name`);
Konkretny przykลad โ przyspieszenie wyszukiwania na title kolumna movies stรณล:
CREATE INDEX `title_index` ON `movies` (`title`);
Kaลผde zapytanie, ktรณre filtruje movies.title jest teraz wspierany przez nowy indeks. Zapytania filtrujฤ
ce wedลug innych kolumn nadal skanujฤ
tabelฤ, chyba ลผe majฤ
wลasny indeks.
Uwaga: Moลผesz utworzyฤ indeks zลoลผony obejmujฤ cy wiele kolumn, jeลli Twoje zapytania zawsze filtrujฤ lub sortujฤ wedลug tej samej kombinacji. Kolejnoลฤ ma znaczenie โ wiodฤ ca kolumna decyduje o tym, czy indeks moลผe zostaฤ uลผyty.
Wyลwietlanie indeksรณw w tabeli
Zastosowanie SHOW INDEXES aby zobaczyฤ wszystkie indeksy zdefiniowane w tabeli.
SHOW INDEXES FROM `table_name`;
Przykลad โ lista indeksรณw na movies stรณล:
SHOW INDEXES FROM `movies`;
Uruchom instrukcjฤ w MySQL Workbench przed myflixdb aby zobaczyฤ istniejฤ
ce indeksy i kolumny, ktรณre obejmujฤ
.
Uwaga: Klucze podstawowe i obce sฤ indeksowane automatycznie przez MySQLKaลผdy indeks ma unikalnฤ nazwฤ i wymienia kolumny, ktรณre obejmuje.
Skลadnia: Usuล indeks
Zastosowanie DROP INDEX Aby usunฤ
ฤ istniejฤ
cy indeks z tabeli. Jest to przydatne, gdy tabela intensywnie zapisana jest spowalniana przez indeks, ktรณry nie jest juลผ dostฤpny do odczytu.
DROP INDEX `index_id` ON `table_name`;
Konkretny przykลad โ pomiล full_names indeks z members_indexed:
DROP INDEX `full_names` ON `members_indexed`;
Rodzaje MySQL Indeksy
MySQL obsลuguje kilka typรณw indeksรณw, z ktรณrych kaลผdy jest przeznaczony do innego obciฤ ลผenia.
| Typ | Cel |
|---|---|
| KLUCZ PODSTAWOWY | Unikalny identyfikator wiersza; powiฤ zany z danymi tabeli w InnoDB. |
| NIECODZIENNCH | Wymusza unikalnoลฤ, peลniฤ c funkcjฤ indeksu. |
| INDEKS (B-drzewo) | Domyลlny indeks pomocniczy uลผywany w zapytaniach zakresowych i wyszukiwaniach rรณwnoลci. |
| PEลNY TEKST | Zoptymalizowany pod kฤ tem wyszukiwania tekstu w jฤzyku naturalnym za pomocฤ funkcji MATCH โฆ AGAINST. |
| PRZESTRZENNE | Indeks R-tree dla typรณw danych GIS, takich jak POINT i POLYGON. |
| HASZYSZ | Wyszukiwania rรณwnoลci w czasie staลym; uลผywane przez moduล pamiฤci masowej MEMORY. |
| Kompozyt (wielokolumnowy) | ลฤ czy kilka kolumn w jeden indeks, respektujฤ c reguลฤ lewego prefiksu. |
Najlepsze praktyki dla MySQL Indeksy
Poniลผsze nawyki sprawiajฤ , ลผe indeksy pozostajฤ uลผyteczne i nie stajฤ siฤ bezuลผyteczne.
- Indeks wzorca zapytania, nie nazwa kolumny: dodawaj indeksy, ktรณre pasujฤ do prawdziwych klauzul WHERE, JOIN i ORDER BY, a nie do โkaลผdej kolumny, ktรณra wydaje siฤ waลผnaโ.
- Obserwuj kolejnoลฤ indeksu zลoลผonego: Aby indeks mรณgล zostaฤ uลผyty, wiodฤ ca kolumna musi pojawiฤ siฤ w zapytaniu.
- Unikaj duplikatรณw indeksรณw: wiodฤ cy prefiks indeksu zลoลผonego obejmuje juลผ wyszukiwania jednokolumnowe na podstawie tego prefiksu.
- Sprawdลบ za pomocฤ EXPLAIN: potwierdziฤ, ลผe planista faktycznie wybiera nowy indeks.
- Usuล nieuลผywane indeksy: posลugiwaฤ siฤ
sys.schema_unused_indexesin MySQL 5.7+ do znajdowania indeksรณw, ktรณrych nic nie odczytuje. - Dopasuj typy danych: jeลli klauzula WHERE porรณwnuje kolumnฤ VARCHAR z liczbฤ , indeksu nie moลผna uลผyฤ z powodu niejawnego rzutowania.


