Coding Interview Prep · Lekcja

Indeksy B-Tree i ich zastosowanie

Co faktycznie przechowuje indeks i jakie operacje przyspiesza.

Lekcja 1 z 413 kroki

Indeksy B-Tree i ich zastosowanie to bezpłatna lekcja Coding Interview Prep 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 Coding Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.

Dlaczego osoby prowadzące rozmowy pytają o indeksy

Gdy osoba prowadząca rozmowę mówi: „to zapytanie działa wolno, co Pan/Pani zrobi?”, niemal zawsze oczekuje odpowiedzi obejmującej indeks. Indeksy są najważniejszym sposobem poprawy wydajności odczytu, dlatego odróżniają kandydatów, którzy zapamiętali składnię, od tych, którzy rozumieją, jak baza danych faktycznie znajduje wiersze.

W tej lekcji zbuduje Pan/Pani precyzyjny model mentalny indeksu B-Tree: dowie się, co przechowuje, jakie operacje przyspiesza i jak omawiać go jak starszy inżynier.

Problem rozwiązywany przez indeks

Bez indeksu znalezienie wierszy spełniających warunek wymusza odczytanie każdego wiersza w tabeli. Jest to skan sekwencyjny (lub pełny skan tabeli). W tabeli zawierającej milion wierszy oznacza to milion sprawdzeń, nawet jeśli pasuje tylko jeden wiersz.

Indeks to osobna, posortowana struktura danych, która pozwala silnikowi przejść bezpośrednio do pasujących wierszy, podobnie jak indeks w książce pozwala znaleźć temat bez czytania każdej strony.

-- No index: the engine reads ALL rows to find this one
SELECT * FROM users WHERE email = 'ada@example.com';

Co właściwie przechowuje B-Tree

Domyślnym indeksem w PostgreSQL, MySQL, SQL Server i większości silników jest B-Tree (zrównoważone drzewo). Przechowuje wartości indeksowanej kolumny w posortowanej kolejności, zorganizowane w płytkie drzewo stron.

  • Każdy liść przechowuje klucze indeksu oraz wskaźnik do właściwego wiersza tabeli.
  • Drzewo pozostaje zrównoważone, więc każde wyszukiwanie dotyka tylko kilku stron, niezależnie od rozmiaru tabeli.

Wyszukiwanie przechodzi od korzenia do liścia w przybliżeniu w log(N) krokach, zamiast skanować wszystkie N wierszy.

Tworzenie pierwszego indeksu

Indeks B-Tree tworzy się za pomocą CREATE INDEX. Należy nadać mu jasną nazwę, aby osoba przeglądająca kod od razu znała tabelę i kolumny.

Po utworzeniu tego indeksu zapytanie filtrujące po email może wykorzystać go do znalezienia pasującego wiersza w kilku odczytach stron zamiast wykonywać pełny skan.

CREATE INDEX idx_users_email ON users (email);

-- Now this lookup uses the index instead of scanning
SELECT * FROM users WHERE email = 'ada@example.com';

Operacje przyspieszane przez B-Tree

Ponieważ B-Tree przechowuje wartości w posortowanej kolejności, przyspiesza znacznie więcej niż tylko dokładne dopasowania. Osoby prowadzące rozmowy techniczne doceniają precyzyjne wyliczenie:

  • Równość: WHERE email = ?
  • Zakres: WHERE age > 30, BETWEEN, <, >=
  • Dopasowanie prefiksu: WHERE name LIKE 'Ada%' (ale NIE '%da')
  • ORDER BY dla indeksowanej kolumny, bez sortowania
  • MIN/MAX, ponieważ znajdują się na krańcach posortowanej struktury

Przykład: zapytanie zakresowe

Rozważmy tabelę orders zawierającą miliony wierszy. Zapytanie raportowe wyszukuje najnowsze zamówienia. Dzięki indeksowi na created_at silnik przechodzi do początku zakresu w posortowanym indeksie i odczytuje kolejne wpisy tylko tak długo, jak jest to potrzebne.

Indeks zmienia pełny skan tabeli w ograniczony skan zakresu, odczytujący tylko pasujący fragment.

CREATE INDEX idx_orders_created_at ON orders (created_at);

SELECT order_id, total
FROM orders
WHERE created_at >= '2026-01-01'
  AND created_at <  '2026-02-01';

Indeksy pomagają również w sortowaniu

Ważny, często pomijany szczegół: ponieważ indeks jest już posortowany, silnik może zwrócić wiersze w kolejności indeksu i pominąć osobny etap sortowania. Ma to znaczenie dla ORDER BY, a szczególnie dla paginacji top-N.

Jeśli sortowanie odbywa się po kolumnie, dla której istnieje pasujący indeks, optymalizator może odczytywać indeks w odpowiedniej kolejności i zakończyć pracę, gdy zbierze wystarczającą liczbę wierszy.

-- Index on created_at lets this avoid a sort and stop after 10 rows
SELECT order_id, total
FROM orders
ORDER BY created_at DESC
LIMIT 10;

Ukryty koszt: heap fetch

Zwykły indeks B-Tree przechowuje tylko indeksowaną kolumnę oraz wskaźnik do wiersza. Po znalezieniu pasujących wpisów silnik nadal musi przejść do tabeli (heap), aby odczytać pozostałe wybrane kolumny.

To dodatkowe odwołanie to heap fetch. Jest tanie dla kilku wierszy, ale kosztowne, gdy zapytanie pasuje do wielu wierszy, co jest jednym z powodów, dla których indeks o niskiej selektywności bywa pomijany. (Później zobaczy Pan/Pani, jak rozwiązują to indeksy pokrywające.)

Potwierdzanie użycia indeksu

Nigdy nie należy twierdzić, że indeks jest używany — trzeba to potwierdzić za pomocą EXPLAIN. Podczas rozmowy technicznej omówienie planu pokazuje rzeczywiste zrozumienie tematu.

  • Seq Scan oznacza, że indeks NIE został użyty.
  • Index Scan lub Index Seek oznacza, że został użyty.

Jeśli dodano indeks, ale nadal widoczny jest skan sekwencyjny, planista uznał skan za tańszy, często dlatego, że zapytanie pasuje do zbyt dużej części tabeli.

EXPLAIN
SELECT * FROM users WHERE email = 'ada@example.com';
-- Look for: Index Scan using idx_users_email

Klucze główne są już indeksowane

Częsta pułapka podczas rozmowy technicznej: zadeklarowanie ograniczenia PRIMARY KEY lub UNIQUE automatycznie tworzy pomocniczy indeks B-Tree. Nie należy dodawać drugiego indeksu na tej samej kolumnie.

Dlatego złączenia i wyszukiwanie po kluczach głównych są już szybkie, a pytanie „czy należy indeksować kolumnę id?” jest zwykle pułapką — zostało to już zrobione automatycznie.

-- This already builds a unique B-Tree index on (id)
CREATE TABLE users (
  id    BIGINT PRIMARY KEY,
  email TEXT UNIQUE
);

Jak to ująć podczas rozmowy technicznej

Warto podsumować to jednym zwięzłym zdaniem, które osoba prowadząca rozmowę od razu zrozumie:

„Indeks B-Tree to posortowana, zrównoważona struktura, która pozwala silnikowi znaleźć wiersze w log(N) odczytach stron zamiast skanować całą tabelę. Przyspiesza operacje równości, zakresów, prefiksów i ORDER BY dla indeksowanych kolumn, ale każde dopasowanie nadal wymaga heap fetch dla kolumn nieindeksowanych.”

Następnie należy poprzeć to wynikiem EXPLAIN. Połączenie modelu z dowodami to właśnie sposób na zdobycie punktów.

Szybki test

Sprawdź swój model mentalny operacji przyspieszanych przez indeks B-Tree.

Podsumowanie: indeksy B-Tree

Najważniejsze wnioski na następną lekcję:

  • B-Tree przechowuje indeksowane wartości w posortowanym, zrównoważonym drzewie, zapewniając wyszukiwanie w czasie log(N).
  • Przyspiesza operacje równości, zakresów, prefiksów (LIKE od lewej), ORDER BY i MIN/MAX.
  • Każde dopasowanie nadal wymaga heap fetch dla kolumn, których nie ma w indeksie.
  • Opakowanie kolumny w funkcję lub użycie wiodącego symbolu wieloznacznego wyłącza możliwość użycia indeksu.
  • Zawsze należy weryfikować użycie indeksu za pomocą EXPLAIN; ograniczenia PRIMARY KEY i UNIQUE automatycznie tworzą indeks.

Dalej: jak ustalać kolejność kolumn, gdy jeden indeks obejmuje kilka z nich.

Bezpłatny start

Ucz się Coding Interview Prep dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
90
Lekcje
360

Często zadawane pytania

Czy lekcja „Indeksy B-Tree i ich zastosowanie” jest bezpłatna?

Tak — pełny tekst „Indeksy B-Tree i ich zastosowanie” 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 Coding Interview Prep, przejdź na CoddyKit PRO. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.

Co nauczysz się w „Indeksy B-Tree i ich zastosowanie”?

Co faktycznie przechowuje indeks i jakie operacje przyspiesza. Ćwiczysz Coding Interview Prep 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ąć Coding Interview Prep?

Nie wymagamy żadnego doświadczenia. Coding Interview Prep 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 i ich zastosowanie”?

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 Coding Interview Prep?

Tak. Każda lekcja Coding Interview Prep 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 i ich zastosowanie
  2. Kolejność kolumn w indeksie złożonym
  3. Indeksy pokrywające i skanowanie wyłącznie indeksu
  4. Kiedy indeksy szkodzą: zapisy i selektywność
← Powrót do Coding Interview Prep