Lekcja: Indeksy w MySQL
Cel lekcji:
- Zrozumienie, czym są indeksy w MySQL i dlaczego są używane.
- Poznanie różnych typów indeksów i ich zastosowań.
- Nauka tworzenia, usuwania i optymalizacji indeksów.
Teoria:
1. Czym są indeksy?
Indeksy w MySQL są strukturami danych, które poprawiają wydajność zapytań odczytujących dane. Działają podobnie do indeksu w książce – pozwalają szybciej znaleźć dane bez konieczności przeszukiwania całej tabeli. Indeks jest tworzony na jednej lub kilku kolumnach tabeli i umożliwia MySQL szybkie lokalizowanie rekordów.
2. Dlaczego używamy indeksów?
Indeksy przyspieszają operacje odczytu, zwłaszcza przy dużych tabelach, gdzie pełne skanowanie tabeli byłoby bardzo czasochłonne. Indeksy są szczególnie przydatne dla kolumn, które często są używane w:
- Klauzulach
WHERE
- Klauzulach
JOIN
- Funkcjach agregujących (
GROUP BY
,ORDER BY
)
Bez indeksów MySQL musiałby przejrzeć każdy rekord, aby znaleźć potrzebne dane, co może znacząco obniżyć wydajność w przypadku dużych zbiorów danych.
3. Typy indeksów w MySQL
MySQL oferuje różne typy indeksów, dostosowane do różnych zastosowań:
-
Primary Key (klucz główny): Jest to specjalny indeks, który identyfikuje każdy rekord w tabeli unikalnie. Tabela może mieć tylko jeden klucz główny.
-
Unique Index (indeks unikalny): Gwarantuje, że wszystkie wartości w indeksowanej kolumnie (lub zestawie kolumn) są unikalne. Używany jest w przypadku, gdy nie chcemy, aby wartości się powtarzały.
-
Index (indeks zwykły): Zwykły indeks służy głównie do przyspieszania wyszukiwania w dużych tabelach. Nie ma ograniczeń co do unikalności wartości.
-
Full-Text Index (indeks pełnotekstowy): Służy do wyszukiwania tekstowego w dużych ilościach tekstu. Używany jest w przypadku przeszukiwania kolumn tekstowych za pomocą funkcji
MATCH
iAGAINST
. -
Spatial Index (indeks przestrzenny): Służy do indeksowania danych przestrzennych (geograficznych) i może być używany w tabelach obsługujących kolumny przestrzenne.
4. Jak działają indeksy?
Kiedy tworzymy indeks na kolumnie, MySQL tworzy strukturę danych, która pozwala na szybkie wyszukiwanie wartości w tej kolumnie. Struktury te przechowują wartości w zorganizowany sposób (np. drzewa B-Tree lub inne struktury), co przyspiesza operacje odczytu. Jednakże, indeksy mogą również spowolnić operacje zapisu, ponieważ MySQL musi aktualizować indeksy po każdym wstawieniu, aktualizacji lub usunięciu danych.
Przykłady zastosowania indeksów
-
Tworzenie indeksu na kolumnie używanej w zapytaniach:
CREATE INDEX idx_employee_name ON employees (name);
Tworzymy indeks na kolumnie
name
tabeliemployees
, co przyspieszy zapytania zawierające tę kolumnę. -
Indeks unikalny:
CREATE UNIQUE INDEX idx_unique_email ON users (email);
Tworzymy unikalny indeks na kolumnie
email
, co zapobiega dodawaniu duplikatów.
Ćwiczenia praktyczne w phpMyAdmin
1. Ćwiczenie 1: Tworzenie indeksu na kolumnie nazwisko
- Cel: Zobaczyć, jak indeks wpływa na wydajność zapytań.
- Kroki:
- W phpMyAdmin wybierz tabelę zawierającą kolumnę
nazwisko
. - Wybierz zakładkę Struktura, a następnie kliknij Indeks obok kolumny
nazwisko
. - Zatwierdź tworzenie indeksu.
- Wykonaj zapytanie
SELECT * FROM tabela WHERE nazwisko = 'Kowalski'
i zwróć uwagę na szybkość wykonania.
- W phpMyAdmin wybierz tabelę zawierającą kolumnę
- Oczekiwany wynik: Dzięki indeksowi zapytanie powinno działać szybciej, zwłaszcza przy dużej liczbie rekordów.
2. Ćwiczenie 2: Tworzenie indeksu unikalnego na kolumnie email
- Cel: Zapobiec wstawianiu duplikatów w kolumnie
email
. - Kroki:
- W phpMyAdmin wybierz tabelę z kolumną
email
. - Przejdź do zakładki Struktura i wybierz Indeks unikalny dla kolumny
email
. - Zatwierdź operację.
- Spróbuj dodać nowy rekord z istniejącym już
email
i sprawdź, czy otrzymasz błąd.
- W phpMyAdmin wybierz tabelę z kolumną
- Oczekiwany wynik: phpMyAdmin nie powinien pozwolić na dodanie duplikatów w kolumnie
email
.
3. Ćwiczenie 3: Tworzenie indeksu pełnotekstowego na kolumnie opis
- Cel: Przyspieszenie wyszukiwania pełnotekstowego.
- Kroki:
- Wybierz tabelę, która zawiera kolumnę
opis
(np. opis produktów). - Przejdź do zakładki Struktura i utwórz indeks pełnotekstowy dla kolumny
opis
. - Wykonaj zapytanie pełnotekstowe, np.
SELECT * FROM produkty WHERE MATCH(opis) AGAINST('laptop')
.
- Wybierz tabelę, która zawiera kolumnę
- Oczekiwany wynik: Wyszukiwanie pełnotekstowe w kolumnie
opis
będzie szybsze.
4. Ćwiczenie 4: Usuwanie indeksu i sprawdzenie wydajności
- Cel: Zobaczyć, jak usunięcie indeksu wpływa na wydajność zapytań.
- Kroki:
- Przejdź do zakładki Struktura i wybierz istniejący indeks w tabeli.
- Usuń indeks, klikając ikonę kosza obok niego.
- Ponownie wykonaj zapytanie, które wcześniej działało szybciej, np.
SELECT * FROM tabela WHERE nazwisko = 'Kowalski'
.
- Oczekiwany wynik: Po usunięciu indeksu zapytanie powinno działać wolniej.
Podsumowanie:
Indeksy są kluczowym elementem optymalizacji zapytań w MySQL. Dobrze zastosowane indeksy mogą znacząco przyspieszyć działanie bazy danych, szczególnie przy dużych zbiorach danych. Jednak nadmiar indeksów lub ich złe zastosowanie może negatywnie wpłynąć na wydajność operacji zapisu. Dlatego ważne jest, aby świadomie wybierać kolumny do indeksowania, analizować wydajność zapytań i unikać zbędnych indeksów.