CodeGym /Kursy /SQL SELF /Główne rodzaje indeksów: B-TREE, HAS...

Główne rodzaje indeksów: B-TREE, HASH, GIN, GiST

SQL SELF
Poziom 37 , Lekcja 1
Dostępny

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-TREE indeksy: uniwersalne indeksy do większości zastosowań.
  • HASH indeksy: zoptymalizowane pod dokładne porównania.
  • GIN indeksy: idealne do wyszukiwania po tablicach i JSONB.
  • GiST indeksy: 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!

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION