0Pricing
SQL Academy · Lekcja

Indeksy złożone i kolejność kolumn

Wybierać kolejność kolumn w indeksach złożonych, rozumieć regułę lewego prefiksu i projektować indeksy obsługujące wiele zapytań

Indeksy złożone i kolejność kolumn to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.

Czym jest indeks złożony?

To indeks obejmujący więcej niż jedną kolumnę. Indeksy B-tree w PostgreSQL mogą obejmować do 32 kolumn, ale w praktyce najczęściej stosuje się 2–4.

CREATE INDEX orders_user_created_idx ON orders(user_id, created_at DESC);

Po co używać indeksu złożonego?

Dwa zastosowania:

  • Zapytanie filtruje jednocześnie według wielu kolumn
  • Zapytanie filtruje według jednej kolumny i sortuje według innej

Reguła lewego prefiksu

Indeks na (a, b, c) może obsługiwać:

  • WHERE a = ?
  • WHERE a = ? AND b = ?
  • WHERE a = ? AND b = ? AND c = ?

NIE obsługuje natomiast samego WHERE b = ? ani WHERE c = ?.

Kolejność ma znaczenie

Najbardziej selektywną i najczęściej filtrowaną kolumnę należy umieścić jako pierwszą. Kolumny używane do porównań równości powinny poprzedzać kolumny zakresowe:

CREATE INDEX orders_user_total_idx ON orders(user_id, total);

-- Best for:  WHERE user_id = 42 AND total > 100
-- Also OK:  WHERE user_id = 42
-- Useless:  WHERE total > 100   (without user_id)

Równość a zakres

Predykaty równości efektywnie korzystają z indeksu, natomiast predykaty zakresowe również go wykorzystują, ale ograniczają dalszą użyteczność. Kolumny używane do porównań równości powinny znajdować się na początku:

-- Index: (status, created_at)
WHERE status = 'paid' AND created_at >= ...   -- both columns used
WHERE created_at >= ... AND status = 'paid'  -- index used for status, range scan on created_at

Kolejność indeksu = kolejność sortowania

Indeks na (user_id, created_at DESC) obsługuje zapytanie „zamówienia użytkownika, od najnowszych” bez osobnego etapu sortowania:

EXPLAIN ANALYZE
SELECT * FROM orders
WHERE user_id = 42
ORDER BY created_at DESC LIMIT 10;
-- Index Scan, no Sort node needed

Uwzględnianie kolumn niebędących kluczami (INCLUDE)

PG 11+ obsługuje INCLUDE w indeksach pokrywających — dodatkowe kolumny są przechowywane w liściach, ale nie są używane do ustalania kolejności:

CREATE INDEX orders_user_idx ON orders(user_id)
  INCLUDE (total, status);

-- Enables Index-Only Scan for queries that need just these columns.

Kiedy NIE tworzyć indeksów złożonych

Jeśli kolumny są odpytywane niezależnie, dwa indeksy jednokolumnowe mogą obsłużyć więcej zapytań. Indeksy złożone ograniczają elastyczność, ale pozwalają, aby „jedno zapytanie miało wszystko” w jednym indeksie.

Łączenie indeksów bitmapowych

PostgreSQL może łączyć wiele indeksów jednokolumnowych za pomocą Bitmap Index Scan:

EXPLAIN ANALYZE
SELECT * FROM orders WHERE user_id = 42 AND status = 'paid';
-- BitmapAnd of two index scans — works without a composite, but slower than the right composite.

Należy uważać na rozrost indeksów

Indeksy złożone są szersze. Szersze indeksy = większe pliki = mniejsza część indeksu mieści się w pamięci podręcznej. Należy projektować je świadomie.

Dobór kolejności kolumn — przykład

Zapytanie: „zamówienia jednego użytkownika z określonego zakresu dat, posortowane według daty”.

-- Index design:
CREATE INDEX orders_user_created_idx
  ON orders(user_id, created_at DESC);

-- Query (efficiently uses the index):
SELECT * FROM orders
WHERE user_id = 42
  AND created_at >= NOW() - INTERVAL '30 days'
ORDER BY created_at DESC LIMIT 10;

Podsumowanie

Indeksy złożone obsługują filtry obejmujące wiele kolumn i pozwalają uniknąć sortowania.

  • Reguła najdłuższego lewego prefiksu
  • Najpierw kolumny z warunkami równości
  • INCLUDE dla kolumn używanych wyłącznie do pokrycia zapytania
  • Dwa indeksy jednokolumnowe czy jeden złożony — zależy od zestawu zapytań

Szybkie sprawdzenie

Masz indeks na (user_id, status, created_at). Które zapytanie NIE MOŻE użyć go efektywnie?

Często zadawane pytania

Czy lekcja „Indeksy złożone i kolejność kolumn” jest bezpłatna?

Tak — pełny tekst „Indeksy złożone i kolejność kolumn” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Indeksy złożone i kolejność kolumn”?

Wybierać kolejność kolumn w indeksach złożonych, rozumieć regułę lewego prefiksu i projektować indeksy obsługujące wiele zapytań Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć SQL Academy?

Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Indeksy złożone i kolejność kolumn”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?

Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Indeksy B-tree a Hash a GiST a GIN
  2. Indeksy złożone i kolejność kolumn
  3. Indeksy częściowe i indeksy wyrażeń
  4. Konserwacja indeksów i bloat
← Powrót do SQL Academy