Indeks to dodatkowa struktura danych w bazie, która przyspiesza wyszukiwanie wierszy w tabeli — działa jak skorowidz na końcu książki. Zamiast czytać całą tabelę od deski do deski (czyli robić full table scan), baza zagląda do indeksu, znajduje wskaźnik do konkretnego wiersza i idzie prosto do celu. Płacisz za to dwiema rzeczami: indeks zajmuje miejsce na dysku oraz spowalnia operacje zapisu (INSERT, UPDATE, DELETE), bo przy każdej zmianie danych trzeba zaktualizować też indeks.
Jak to działa
Najpopularniejszy typ indeksu to B-tree (drzewo zrównoważone). Trzyma wartości w posortowanej, drzewiastej strukturze, dzięki czemu baza dochodzi do szukanego wiersza w czasie logarytmicznym — przy milionie wierszy to kilka „skoków” zamiast miliona porównań. B-tree świetnie radzi sobie z porównaniami (=, <, >, BETWEEN) i sortowaniem. Są też inne rodzaje: hash (tylko równość, bardzo szybki), GIN w PostgreSQL (do JSON-a i full-text search) czy indeksy przestrzenne.
Indeks zakładasz na kolumnach, po których często filtrujesz lub łączysz tabele — typowo na kluczach obcych i kolumnach z klauzul WHERE, JOIN i ORDER BY. Klucz główny (PRIMARY KEY) dostaje indeks automatycznie.
Przykład z praktyki
Masz tabelę users z milionem rekordów i logujesz po e-mailu:
SELECT * FROM users WHERE email = '[email protected]';
Bez indeksu baza przeskanuje wszystkie wiersze. Zakładasz indeks:
CREATE INDEX idx_users_email ON users(email);
i zapytanie zaczyna trafiać w punkt. Czy indeks faktycznie został użyty, sprawdzisz komendą EXPLAIN ANALYZE (PostgreSQL/MySQL) — jeśli w planie widzisz Index Scan zamiast Seq Scan, jest dobrze.
Częste błędy i mity
- „Założę indeks na każdej kolumnie, będzie szybciej" — nie. Każdy indeks zwalnia zapisy i je je miejsce. Indeksuj to, po czym realnie szukasz.
- Funkcja na kolumnie zabija indeks.
WHERE LOWER(email) = '...'nie użyje zwykłego indeksu naemail— potrzebujesz indeksu funkcyjnego albo zmiany zapytania. - Kolejność kolumn w indeksie złożonym ma znaczenie. Indeks na
(a, b)pomoże przy filtrowaniu poaluba + b, ale nie po samymb. - Indeksy się fragmentują i trzeba je czasem przebudować, zwłaszcza przy intensywnym zapisie.
Pojęcia powiązane
B-tree, klucz główny, klucz obcy, full table scan, EXPLAIN / plan zapytania, indeks złożony, indeks unikalny, normalizacja, optymalizacja zapytań.