Indeks

Struktura danych przyspieszająca wyszukiwanie wierszy w tabeli, działająca jak skorowidz. Skraca czas zapytań kosztem dodatkowego miejsca i wolniejszych zapisów.

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 na email — potrzebujesz indeksu funkcyjnego albo zmiany zapytania.
  • Kolejność kolumn w indeksie złożonym ma znaczenie. Indeks na (a, b) pomoże przy filtrowaniu po a lub a + b, ale nie po samym b.
  • 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ń.