No więc, w świecie PostgreSQL mamy kilka rodzajów indeksów i każdy z nich został stworzony do swojej unikalnej roli. To trochę jak wybieranie środka transportu: możesz użyć roweru na przejażdżkę po parku, ale jeśli chcesz przejechać na drugi koniec miasta, raczej wybierzesz samochód. Tak samo różne indeksy nadają się do różnych zadań.
W PostgreSQL główne rodzaje indeksów to:
B-TREEindeksy: uniwersalne indeksy do większości zastosowań.HASHindeksy: zoptymalizowane pod dokładne porównania.GINindeksy: idealne do wyszukiwania po tablicach i JSONB.GiSTindeksy: używane do skomplikowanych typów danych, np. geograficznych.
Indeksy są po to, żeby przyspieszyć wyszukiwanie wierszy. Mają 4 różne typy optymalizacji: każdy typ przyspiesza konkretne operacje i lepiej radzi sobie z określonymi typami danych.
Nie możesz zarządzać indeksami w żaden inny sposób. Jedyne co możesz zrobić, to wybrać typ indeksu: żaden albo jeden z powyższych. Zaraz rozkminimy każdy z nich, żeby wiedzieć kiedy i jak ich używać.
Indeksy B-TREE
B-TREE (skrót od "balanced tree") — to najczęściej używany typ indeksu, podstawa działania PostgreSQL. Ten indeks tworzy strukturę drzewiastą, w której dane są zorganizowane tak, żeby przyspieszyć wyszukiwanie, sortowanie i filtrowanie.
Wyobraź sobie bibliotekę z półkami, gdzie każda półka ma książki ułożone alfabetycznie. Jeśli szukasz książki na literę "M", nie musisz przeglądać wszystkich po kolei — wystarczy zacząć od środka. Na podobnych zasadach działają zbalansowane drzewa.
Kiedy ich używać?
Prawie zawsze! B-TREE indeksy są szczególnie przydatne do:
- Wyszukiwania po zakresach:
WHERE price > 100. - Sortowania:
ORDER BY name ASC. - Wyszukiwania po równości:
WHERE id = 42.
Przykład tworzenia:
-- Tworzymy indeks B-TREE dla kolumny price w tabeli products:
CREATE INDEX idx_price ON products(price);
Kiedy w zapytaniu napiszesz coś w stylu WHERE price > 100, PostgreSQL ogarnie to przez ten indeks i nie będzie musiał przeglądać całej tabeli.
Indeksy HASH
HASH indeksy używają hash-tabel do szybkiego wyszukiwania. Ich mocną stroną jest dokładne porównywanie wartości. Ale HASH indeksy mają ograniczenie: nie obsługują wyszukiwania po zakresach ani sortowania.
To jak kartoteka, gdzie każda karta ma konkretny numer. Szukasz karty nr 42 i bibliotekarz od razu ją znajduje. Ale jeśli powiesz: „pokaż mi karty od 40 do 50”, to już nie przejdzie.
HASH indeksy nadają się tylko do dokładnego wyszukiwania:
WHERE email = 'user@example.com'.SELECT ... WHERE id = 123.
Jeśli potrzebujesz zakresów albo sortowania, HASH się nie sprawdzi.
Przykład tworzenia:
-- Tworzymy hash-indeks dla kolumny email w tabeli users:
CREATE INDEX idx_email_hash ON users USING HASH (email);
Teraz PostgreSQL będzie używał tego indeksu do zapytań typu WHERE email = 'user@example.com'.
Uwaga: HASH indeksy są do specyficznych przypadków i używa się ich rzadziej niż B-TREE.
Indeksy GIN (Generalized Inverted Index)
GIN — to specjalistyczny indeks, który robi prawdziwą magię z tablicami, JSONB i danymi tekstowymi. Wyobraź sobie szafę z tysiącem szuflad, każda podpisana. Na przykład w szufladzie "jabłka" są wszystkie jabłka, w "banany" — banany. Żeby znaleźć jabłka albo banany, nie musisz grzebać we wszystkich szufladach — idziesz od razu do właściwej.
GIN indeksy są potrzebne do:
- Wyszukiwania po tablicach:
@>(zawiera),<@(jest zawarty). - Danych JSONB:
WHERE jsonb_data @> '{"klucz": "wartość"}'.
Przykład tworzenia
-- Tworzymy GIN-indeks dla kolumny tags, która zawiera tablice:
CREATE INDEX idx_tags_gin ON products USING GIN (tags);
Teraz PostgreSQL może efektywnie znajdować produkty, gdzie tagami są np. "elektronika" i "polecane".
Indeksy GiST (Generalized Search Tree)
GiST indeksy — to potężne narzędzie do pracy z bardziej złożonymi typami danych, w tym współrzędnymi geograficznymi i zakresami. Budują drzewa zoptymalizowane pod wyszukiwanie przestrzenne i po zakresach.
Wyobraź sobie mapę miasta, gdzie każdy punkt jest zaznaczony na podstawie współrzędnych. Możesz szybko znaleźć wszystkie punkty w promieniu 5 km od siebie.
GiST nadają się do:
- Danych geograficznych:
SELECT ... FROM locations WHERE ST_DWithin(geom, point, distance). - Wyszukiwania po zakresach:
WHERE date_range && '[2023-01-01, 2023-12-31]'.
Przykład:
-- Tworzymy GiST-indeks dla kolumny location, która zawiera dane geograficzne:
CREATE INDEX idx_location_gist ON places USING GiST (location);
Teraz możesz robić skomplikowane zapytania geograficzne, np. szukać najbliższych punktów.
Tabela porównawcza indeksów
| Typ indeksu | Do czego się nadaje... | Przykłady użycia | Uwagi |
|---|---|---|---|
B-TREE |
Wyszukiwanie po zakresach, sortowanie | price > 100, ORDER BY name ASC |
Uniwersalny indeks. |
HASH |
Dokładne sprawdzanie równości | email = 'user@example.com', id = 42 |
Nie obsługuje zakresów. |
GIN |
Tablice, JSONB | tags @> '{tech}', jsonb_data @> '{"klucz": "wartość"}' |
Szybszy dla złożonych danych. |
GiST |
Geografia, zakresy, odległości | ST_DWithin(geom, point, distance) |
Używany do geodanych. |
Teraz już znasz podstawowe typy indeksów w PostgreSQL i ich zastosowania. Zapamiętaj: wybór indeksu to strategiczny ruch, od którego zależy szybkość twoich zapytań. Szach-mat, lagi!
GO TO FULL VERSION