Lekcja 10 – Indeksy w bazach danych

W tej lekcji omówimy jeden z kluczowych mechanizmów stosowanych w bazach danych, który ma na celu poprawę wydajności zapytań – indeksy. Indeksy pełnią podobną funkcję do indeksu w książce – pozwalają na szybkie odnalezienie określonych danych w dużych zbiorach, zamiast przeszukiwać całą tabelę. W dobrze zaprojektowanych bazach danych indeksy mogą znacznie zwiększyć szybkość wyszukiwania, sortowania i filtrowania danych.

Zrozumienie, czym są indeksy, jak je tworzyć, jakie rodzaje indeksów są dostępne, oraz jak optymalizować zapytania z ich pomocą, jest kluczowe w zarządzaniu bazami danych, zwłaszcza gdy pracujemy z dużymi zestawami danych.

Czym są indeksy?

Indeks to specjalna struktura danych, która przechowuje wartości z jednej lub więcej kolumn tabeli w sposób, który ułatwia szybkie wyszukiwanie. Kiedy tworzysz indeks na kolumnie, baza danych tworzy oddzielną strukturę, w której przechowuje wartości z tej kolumny w uporządkowanej formie, wraz z odniesieniami do wierszy, które zawierają te wartości. Dzięki temu, zamiast przeszukiwać każdy wiersz w tabeli, baza danych może skorzystać z indeksu, aby szybciej znaleźć interesujące nas dane.

Indeksy mogą być tworzone na pojedynczych kolumnach lub na wielu kolumnach jednocześnie, w zależności od tego, jakie zapytania są najczęściej wykonywane w danej bazie.

Typy indeksów

W SQL istnieje kilka rodzajów indeksów, które mogą być tworzone w zależności od potrzeb. Oto najpopularniejsze z nich:

  1. Indeks kluczowy (PRIMARY KEY) – każda tabela może mieć tylko jeden klucz główny (PRIMARY KEY), który jednoznacznie identyfikuje każdy rekord w tabeli. Indeks dla klucza głównego tworzony jest automatycznie, gdy deklarujemy kolumnę jako PRIMARY KEY.
  2. Indeks unikalny (UNIQUE) – indeks unikalny gwarantuje, że wartości w danej kolumnie lub grupie kolumn są unikalne, co oznacza, że nie mogą się powtarzać. Można go używać np. do przechowywania adresów e-mail, gdzie każdy adres musi być unikalny.
  3. Indeks zwykły (B-tree) – standardowy indeks, który przyspiesza wyszukiwanie, sortowanie i filtrowanie danych. Jest to najczęściej używany rodzaj indeksu.
  4. Indeks złożony – indeks, który obejmuje więcej niż jedną kolumnę. Jest używany w sytuacjach, gdy zapytania często korzystają z wielu kolumn jednocześnie w klauzulach WHERE lub ORDER BY.
  5. Indeks pełnotekstowy (FULLTEXT) – specjalny indeks używany do wyszukiwania tekstu w dużych kolumnach typu TEXT. Stosowany np. do wyszukiwania słów w dokumentach lub opisach.
  6. Indeks przestrzenny (SPATIAL) – indeks stosowany w bazach danych do operacji na danych przestrzennych (np. współrzędnych geograficznych). Jest używany do przetwarzania danych w systemach GIS (Geographic Information Systems).

Tworzenie indeksów

Aby utworzyć indeks, używamy polecenia CREATE INDEX. Możemy tworzyć indeksy na jednej lub kilku kolumnach, w zależności od potrzeb i tego, które zapytania chcemy zoptymalizować.

Składnia tworzenia indeksu wygląda następująco:

CREATE INDEX nazwa_indeksu
ON nazwa_tabeli (kolumna1, kolumna2, ...);

Przykład: Tworzenie indeksu na kolumnie Email w tabeli Uzytkownicy:

CREATE INDEX idx_email
ON Uzytkownicy (Email);

W tym przypadku indeks idx_email zostanie utworzony na kolumnie Email. Dzięki temu zapytania, które będą filtrować użytkowników na podstawie adresu e-mail, będą wykonywać się szybciej.

Indeksy unikalne

Jeżeli chcemy, aby indeks gwarantował unikalność wartości w danej kolumnie, możemy utworzyć UNIQUE INDEX. W ten sposób zapobiegniemy wstawianiu duplikatów do tabeli.

Składnia:

CREATE UNIQUE INDEX nazwa_indeksu
ON nazwa_tabeli (kolumna1, kolumna2, ...);

Przykład: Tworzenie unikalnego indeksu na kolumnie Email:

CREATE UNIQUE INDEX idx_email_unique
ON Uzytkownicy (Email);

Dzięki temu indeksowi, baza danych zagwarantuje, że żaden użytkownik nie będzie mógł mieć takiego samego adresu e-mail, co inny użytkownik.

Indeksy złożone

Indeks złożony to indeks, który obejmuje więcej niż jedną kolumnę. Jest używany, gdy często wyszukujemy dane na podstawie więcej niż jednej kolumny.

Składnia:

CREATE INDEX nazwa_indeksu
ON nazwa_tabeli (kolumna1, kolumna2);

Przykład: Tworzenie indeksu na kolumnach Imie i Nazwisko:

CREATE INDEX idx_imie_nazwisko
ON Uzytkownicy (Imie, Nazwisko);

Ten indeks będzie szczególnie użyteczny, gdy często wyszukujemy dane użytkowników na podstawie zarówno imienia, jak i nazwiska jednocześnie.

Kiedy używać indeksów?

Indeksy są niezwykle użyteczne, ale ich tworzenie i zarządzanie nimi wymaga ostrożności. Tworzenie zbyt wielu indeksów może negatywnie wpłynąć na wydajność operacji takich jak INSERT, UPDATE czy DELETE, ponieważ baza danych musi aktualizować indeksy za każdym razem, gdy dane w tabeli się zmieniają.

Najczęstsze przypadki, w których warto tworzyć indeksy:

  1. Wyszukiwanie na podstawie kolumny – jeśli często wyszukujesz dane w jednej kolumnie, np. na podstawie numeru identyfikacyjnego, adresu e-mail lub daty, warto utworzyć indeks na tej kolumnie.
  2. Sortowanie wyników – jeśli wyniki zapytań są często sortowane według konkretnej kolumny lub grupy kolumn, indeksy mogą znacząco przyspieszyć działanie takich operacji.
  3. Klauzula WHERE – jeśli często stosujesz filtrowanie danych przy użyciu klauzuli WHERE, indeksy mogą przyspieszyć przetwarzanie tych zapytań.
  4. Klauzula JOIN – jeśli często łączysz tabele na podstawie kolumn, indeksowanie tych kolumn może przyspieszyć działanie operacji JOIN.

Wady indeksów

Chociaż indeksy znacznie poprawiają wydajność zapytań, mają również swoje wady:

  1. Zajmują dodatkową przestrzeń – każdy indeks jest oddzielną strukturą danych, która zajmuje miejsce na dysku. Im więcej indeksów, tym więcej miejsca potrzebuje baza danych.
  2. Wpływ na operacje modyfikujące – operacje takie jak INSERT, UPDATE i DELETE są wolniejsze, ponieważ każda zmiana danych wymaga także zaktualizowania indeksów. Jeśli tabela ma wiele indeksów, modyfikacje mogą stać się powolne.
  3. Nie każdy indeks poprawi wydajność – źle zaprojektowane indeksy mogą nie przynieść oczekiwanych korzyści. Kluczem jest wybór odpowiednich kolumn do indeksowania na podstawie tego, jakie zapytania są najczęściej wykonywane.

Usuwanie indeksów

Jeśli dany indeks nie jest już potrzebny lub zauważysz, że spowalnia operacje modyfikujące, możesz go usunąć za pomocą polecenia DROP INDEX.

Składnia:

DROP INDEX nazwa_indeksu ON nazwa_tabeli;

Przykład: Usuwanie indeksu na kolumnie Email:

DROP INDEX idx_email ON Uzytkownicy;

Optymalizacja zapytań za pomocą EXPLAIN

Aby zrozumieć, jak zapytania korzystają z indeksów, warto używać polecenia EXPLAIN. EXPLAIN pokazuje, w jaki sposób baza danych zamierza wykonać zapytanie i czy używa indeksów.

Przykład użycia EXPLAIN:

EXPLAIN SELECT Imie, Nazwisko FROM Uzytkownicy WHERE Email = 'jan.kowalski@example.com';

Wyniki EXPLAIN pokażą, czy zapytanie używa indeksu na kolumnie Email i jak przetwarzane są dane.

Podsumowanie

Indeksy są jednym z najważniejszych narzędzi w optymalizacji baz danych. Mogą znacząco przyspieszyć działanie zapytań, zwłaszcza gdy mamy do czynienia z dużymi tabelami i częstym wyszukiwaniem danych na podstawie określonych kolumn. Jednak użycie indeksów wymaga odpowiedniej strategii, ponieważ mogą one także obciążać bazę danych, szczególnie podczas operacji modyfikujących dane. Ważne jest, aby analizować, które kolumny warto indeksować, oraz monitorować wydajność zapytań za pomocą narzędzi takich jak EXPLAIN.

W kolejnej lekcji zajmiemy się technikami optymalizacji zapytań oraz zrozumieniem, jak struktura bazy danych i zapytania SQL mogą wpływać na wydajność systemu.

Gratulacje! Ukończyłeś lekcję 10.
Przejdź teraz do lekcji 11 >> Optymalizacja zapytań SQL


Spis Treści - darmowy kurs SQL


Wprowadzenie: Czym jest baza danych?
Lekcja 1: Instalacja dedykowanego środowiska dla SQL
Lekcja 2: Tworzenie bazy danych
Lekcja 3: Tworzenie tabel w SQL
Lekcja 4: Wstawianie danych do bazy danych SQL
Lekcja 5: Pobieranie danych z bazy danych SQL
Lekcja 6: Aktualizacja i usuwanie danych SQL
Lekcja 7: Operacje na danych (JOIN)
Lekcja 8: Funkcje agregujące i grupowanie danych (GROUP BY)
Lekcja 9: Podzapytania (Subqueries)
Lekcja 10: Indeksy w bazach danych
Lekcja 11: Optymalizacja zapytań SQL
Lekcja 12: Transakcje w bazach danych
Lekcja 13: Zarządzanie blokadami (Locks) i dostępem do danych
Lekcja 14: Replikacja danych w bazach danych
Lekcja 15: Partycjonowanie danych SQL
Lekcja 16: Widoki (Views) w bazach danych
Lekcja 17: Procedury składowane (Stored Procedures) i funkcje w SQL
Lekcja 18: Wyzwalacze (Triggers) w bazach danych
Lekcja 19: Zaawansowane indeksowanie w bazach danych
Lekcja 20: Narzędzia do zarządzania dużymi danymi (Big Data) w SQL
Lekcja 21: Bezpieczeństwo baz danych


Dodatki: 
- Spis najważniejszych funkcji SQL