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.

  • ๐Ÿ“š Traktuj indeksy jak sล‚ownik: Sortujฤ… wartoล›ci kolumn, tak aby wyszukiwarka mogล‚a zlokalizowaฤ‡ wiersze bez koniecznoล›ci skanowania caล‚ej tabeli.
  • ๐Ÿ› ๏ธ. Utwรณrz przy stole lub po: Zdefiniuj indeks w wierszu polecenia CREATE TABLE lub dodaj go pรณลบniej za pomocฤ… polecenia CREATE INDEX w tabeli na ลผywo.
  • ๐Ÿ” Sprawdลบ za pomocฤ… SHOW INDEXES: Uลผyj polecenia SHOW INDEXES FROM table_name, aby wyล›wietliฤ‡ listฤ™ wszystkich indeksรณw, czฤ™ล›ci klucza, kardynalnoล›ci i flag unikatowoล›ci.
  • ๐Ÿงน Odrzuฤ‡, gdy koszt zapisu jest zbyt wysoki: Indeksy spowalniajฤ… polecenia INSERT i UPDATE โ€” usuล„ nieuลผywane indeksy poleceniem DROP INDEX, aby odzyskaฤ‡ przepustowoล›ฤ‡ zapisu.
  • ๐Ÿค– Wykorzystaj sztucznฤ… inteligencjฤ™ do projektowania indeksรณw: Asystenci AI odczytujฤ… dzienniki powolnych zapytaล„, sugerujฤ… kolejnoล›ฤ‡ kolumn dla indeksรณw zล‚oลผonych i wyjaล›niajฤ… plany EXPLAIN wiersz po wierszu.

MySQL Koncepcja indeksu

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.

MySQL Koncepcja indeksu

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:

  1. W momencie tworzenia tabeli.
  2. 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.

tabela members_indexed w MySQL Workbench

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_indexes in 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.

FAQ

Klucz podstawowy jednoznacznie identyfikuje kaลผdy wiersz i jest zawsze indeksowany. Ogรณlny INDEKS przyspiesza wyszukiwanie, ale dopuszcza duplikowanie wartoล›ci. Kaลผdy klucz podstawowy jest indeksem, ale nie kaลผdy indeks jest kluczem podstawowym.

Unikaj indeksรณw w bardzo maล‚ych tabelach, w kolumnach z niewielkฤ… liczbฤ… odrฤ™bnych wartoล›ci (niska kardynalnoล›ฤ‡) oraz w tabelach, w ktรณrych zapisy sฤ… zapisywane znacznie czฤ™ล›ciej niลผ odczytywane. Kaลผdy dodatkowy indeks spowalnia kaลผdฤ… operacjฤ™ INSERT, UPDATE i DELETE.

Indeks zล‚oลผony (wielokolumnowy) obejmuje wiฤ™cej niลผ jednฤ… kolumnฤ™ w jednym indeksie. Szanuje reguล‚ฤ™ prefiksu skrajnie lewego, wiฤ™c moลผe obsล‚ugiwaฤ‡ zapytania filtrujฤ…ce wedล‚ug pierwszej kolumny, pierwszych dwรณch kolumn itd., ale nie tylko drugiej kolumny.

Uruchom EXPLAIN przed poleceniem SELECT. klucz kolumna pokazuje, ktรณry indeks wybraล‚ optymalizator, podczas gdy rodzaj oraz wydziwianie poinformuje Ciฤ™, czy ล›cieลผka dostฤ™pu jest wydajna.

Indeks pokrywajฤ…cy zawiera wszystkie kolumny potrzebne zapytaniu, wiฤ™c silnik odpowiada na zapytanie wyล‚ฤ…cznie z indeksu, bez odczytywania tabeli. W takim przypadku EXPLAIN zgล‚asza komunikat โ€žUลผywam indeksuโ€.

Do najczฤ™stszych przyczyn naleลผฤ…: owiniฤ™cieping kolumna w funkcji (WHERE YEAR(col) = โ€ฆ), niejawne rzutowanie typรณw, bardzo niska kardynalnoล›ฤ‡ i nieaktualne statystyki. Uruchom ANALYZE TABLE aby odล›wieลผyฤ‡ statystyki i sprawdziฤ‡ EXPLAIN z prawdziwego powodu.

Asystenci AI pobierajฤ… logi powolnych zapytaล„, klasyfikujฤ… najdroลผsze wzorce, sugerujฤ… indeksy jednokolumnowe lub zล‚oลผone i objaล›niajฤ… plany EXPLAIN prostym jฤ™zykiem. Skracajฤ… czas dostrajania z godzin do minut w przypadku rutynowych zadaล„.

Tak. Narzฤ™dzia AI przeksztaล‚cajฤ… proล›bฤ™, takฤ… jak โ€žprzyspiesz wyszukiwanie klientรณw wedล‚ug adresu e-mail i daty rejestracjiโ€, w dziaล‚ajฤ…ce polecenie CREATE INDEX, zalecajฤ… kolejnoล›ฤ‡ kolumn i wyjaล›niajฤ… oczekiwany wpล‚yw na przepustowoล›ฤ‡ odczytu i zapisu.

Podsumuj ten post nastฤ™pujฤ…co: