Indeksy B-tree a Hash a GiST a GIN
Porównywać główne typy indeksów w PostgreSQL i wybierać właściwy do zapytań sprawdzających równość, zakres, geometrię, JSON i pełnotekstowych
Indeksy B-tree a Hash a GiST a GIN to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 1 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.
Przegląd typów indeksów
PostgreSQL ma kilka typów indeksów, z których każdy jest zoptymalizowany pod kątem innych sposobów dostępu do danych:
- B-tree — równości i zakresy (domyślny)
- Hash — tylko równości
- GiST — dane geometryczne, pełnotekstowe i niestandardowe
- GIN — wartości złożone (tablice, JSONB, wyszukiwanie pełnotekstowe)
- BRIN — zakresy bloków — ogromne, posortowane tabele
- SP-GiST — drzewa z podziałem przestrzeni
B-tree: domyślny typ
Używany w 95% przypadków. Obsługuje operatory =, <, <=, >, >=, BETWEEN oraz ORDER BY:
CREATE INDEX users_email_idx ON users(email);
CREATE INDEX orders_created_at_idx ON orders(created_at DESC);Indeks Hash
Obsługuje tylko wyszukiwanie według równości. Jest odporny na awarie od PG 10. Jest mniejszy i nieco szybszy od B-tree dla czystych porównań równości, ale ma bardzo wąskie zastosowanie:
CREATE INDEX sessions_token_hash ON sessions USING HASH (token);
-- Useful for very high-cardinality equality lookups; usually B-tree is fine.Indeks GiST
Generalised Search Tree — rozszerzalny indeks obsługujący typy zakresowe, typy geometryczne, adresy IP i wyszukiwanie pełnotekstowe:
CREATE INDEX events_during_idx ON events USING GIST (during);
-- 'during' is a tstzrange — finds overlapping ranges efficiently.
CREATE INDEX places_location_idx ON places USING GIST (location);
-- PostGIS geometry — nearest neighbour, intersects.Indeks GIN
Generalised Inverted Index — najlepszy dla wartości złożonych, w których każdy element może odpowiadać wielu wierszom:
CREATE INDEX articles_tags_gin ON articles USING GIN (tags);
-- tags is TEXT[]; query with @> or && operators
CREATE INDEX articles_doc_gin ON articles USING GIN (search_doc);
-- For tsvector full-text search
CREATE INDEX events_data_gin ON events USING GIN (data jsonb_path_ops);
-- For JSONB containment queriesIndeks BRIN
Block Range INdexes podsumowują zakresy wartości dla każdych N stron. Są niewielkie (kilobajty dla tabel o rozmiarze terabajtów), ale skuteczne tylko wtedy, gdy dane są fizycznie posortowane według indeksowanej kolumny:
CREATE INDEX events_ts_brin ON events USING BRIN (ts);
-- Excellent for append-only time-series tables.Porównanie rozmiarów
Dla tabeli zawierającej miliard wierszy:
- B-tree na kolumnie BIGINT: ~30 GB
- BRIN na kolumnie TIMESTAMPTZ: ~1 MB
BRIN jest radykalnie mniejszy, ale przewyższa B-tree tylko w zapytaniach sekwencyjnych lub dotyczących posortowanych danych.
Wybór typu indeksu
Schemat wyboru:
- Równość i zakres dla skalarnego typu danych → B-tree
- Równość w ogromnym zbiorze wartości skalarnych → B-tree (Hash tylko po przeprowadzeniu pomiarów)
- Tablice, JSONB lub wyszukiwanie pełnotekstowe → GIN
- Typy zakresowe, geometria lub niedokładne wyszukiwanie tekstu → GiST
- Ogromna, posortowana tabela tylko z dopisywaniem danych → BRIN
Kompromisy związane z GIN
GIN jest najszybszy w zapytaniach typu „znajdź wszystkie wiersze zawierające X”, ale wstawianie i aktualizowanie danych trwa dłużej niż w przypadku B-tree. W tabelach, w których często wykonywany jest zapis, warto rozważyć fastupdate=off, aby kontrolować listę oczekujących wpisów GIN.
Klasy operatorów
Każdy typ indeksu współpracuje z określonymi operatorami. JSONB używa jsonb_path_ops do tworzenia mniejszych i szybszych indeksów obsługujących wyłącznie operacje zawierania:
CREATE INDEX e_data_gin ON events USING GIN (data jsonb_path_ops);
-- Half the size of default jsonb_ops, supports @> only.Indeksy złożone według typu
Indeksy złożone B-tree używają dopasowania od lewego prefiksu. Złożone indeksy GIN działają, ale są większe; zwykle tworzy się osobne indeksy GIN dla pojedynczych kolumn.
Podsumowanie
Typ indeksu należy dobrać do zapytania.
- B-tree: domyślny
- GIN: tablice, JSONB, wyszukiwanie pełnotekstowe
- GiST: zakresy, geometria, niedokładne wyszukiwanie
- BRIN: dane sekwencyjne, tabele tylko z dopisywaniem
Szybki test
Indeksowana jest kolumna TEXT[] używana w zapytaniach sprawdzających zawieranie wartości. Który typ indeksu będzie odpowiedni?
Często zadawane pytania
Czy lekcja „Indeksy B-tree a Hash a GiST a GIN” jest bezpłatna?
Tak — pełny tekst „Indeksy B-tree a Hash a GiST a GIN” 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 B-tree a Hash a GiST a GIN”?
Porównywać główne typy indeksów w PostgreSQL i wybierać właściwy do zapytań sprawdzających równość, zakres, geometrię, JSON i pełnotekstowych Ć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 1 z 4.
Ile czasu zajmuje lekcja „Indeksy B-tree a Hash a GiST a GIN”?
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
- Indeksy B-tree a Hash a GiST a GIN
- Indeksy złożone i kolejność kolumn
- Indeksy częściowe i indeksy wyrażeń
- Konserwacja indeksów i bloat