Indeks złożony

Indeks obejmujący kilka kolumn jednocześnie. Przyspiesza zapytania filtrujące po tych kolumnach w określonej kolejności.

Indeks złożony (ang. composite index) to indeks bazodanowy obejmujący dwie lub więcej kolumn jednocześnie, a nie pojedynczą kolumnę. Dzięki temu baza może błyskawicznie wyszukiwać i sortować dane filtrowane po kombinacji tych kolumn, zamiast czytać całą tabelę wiersz po wierszu.

Jak to działa

Indeks złożony przechowuje wartości z kilku kolumn posortowane w ściśle określonej kolejności — najpierw po pierwszej kolumnie, potem (w obrębie tych samych wartości) po drugiej i tak dalej. To trochę jak książka telefoniczna posortowana po nazwisku, a dopiero potem po imieniu. Znajdziesz w niej szybko wszystkich Kowalskich, a wśród nich Annę. Ale jeśli znasz tylko imię „Anna”, książka jest bezużyteczna — musisz przejrzeć wszystko.

Stąd kluczowa zasada: kolejność kolumn w indeksie ma znaczenie. Obowiązuje tzw. reguła lewego prefiksu (leftmost prefix): indeks na (a, b, c) pomoże zapytaniom filtrującym po a, po (a, b) oraz po (a, b, c) — ale raczej nie pomoże zapytaniu szukającemu wyłącznie po b albo c.

Przykład z praktyki

Załóżmy, że w PostgreSQL albo MySQL masz tabelę orders i często odpytujesz ją tak: pokaż zamówienia danego klienta posortowane po dacie. Tworzysz indeks złożony:

CREATE INDEX idx_orders_customer_date ON orders (customer_id, created_at);

Teraz zapytanie WHERE customer_id = 42 ORDER BY created_at DESC trafia prosto w indeks — baza nie skanuje miliona wierszy, tylko fragment już posortowany tak, jak go potrzebujesz. Sprawdzisz to, dopisując EXPLAIN przed zapytaniem: jeśli zamiast Seq Scan zobaczysz Index Scan, jesteś w domu.

Częste błędy i mity

  • Zła kolejność kolumn. Indeks (created_at, customer_id) nie przyspieszy filtrowania po samym customer_id. Najbardziej selektywną kolumnę albo tę, po której zawsze filtrujesz na równość, dawaj zwykle na początek.
  • „Dorzucę indeks na każdą kolumnę z osobna”. Pięć osobnych indeksów to nie to samo co jeden złożony — dla zapytań po kombinacji kolumn ten jeden potrafi być wielokrotnie szybszy.
  • Indeksy nie są darmowe. Każdy spowalnia INSERT, UPDATE i DELETE oraz zajmuje miejsce na dysku. Nie indeksuj „na zapas”.

Pojęcia powiązane: indeks (jednokolumnowy), indeks pokrywający (covering index), klucz główny, reguła lewego prefiksu, plan zapytania (EXPLAIN), kardynalność i selektywność, B-tree.