B-træ-indekser, og hvordan de hjælper
Hvad et indeks faktisk gemmer, og hvilke operationer det gør hurtigere.
B-træ-indekser, og hvordan de hjælper er en gratis Forberedelse til SQL-interview-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Forberedelse til SQL-interview, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Forberedelse til SQL-interview-kurset indeholder 4 lektioner i alt.
Hvorfor interviewere spørger om indekser
Når en interviewer siger 'denne forespørgsel er langsom, hvad gør du?', indebærer det svar, de næsten altid lytter efter, et indeks. Indekser er det vigtigste håndtag til bedre læseydelse, så de skelner mellem kandidater, der har lært syntaks udenad, og kandidater, der forstår, hvordan en database faktisk finder rækker.
I denne lektion opbygger du en præcis mental model af B-træ-indekset: hvad det gemmer, hvilke operationer det gør hurtigere, og hvordan du forklarer det, som en erfaren udvikler ville gøre.
Det problem, et indeks løser
Uden et indeks skal databasen læse hver eneste række i tabellen for at finde de rækker, der opfylder en betingelse. Det kaldes en sekventiel scanning (eller en fuld tabelscanning). I en tabel med en million rækker betyder det en million rækketjek, selv hvis kun én række matcher.
Et indeks er en separat, sorteret datastruktur, der lader databasemotoren springe direkte til de matchende rækker, på samme måde som et bogindeks lader dig finde et emne uden at læse hver side.
-- No index: the engine reads ALL rows to find this one
SELECT * FROM users WHERE email = 'ada@example.com';Hvad et B-træ faktisk gemmer
Standardindekset i PostgreSQL, MySQL, SQL Server og de fleste andre databasemotorer er et B-træ (et balanceret træ). Det gemmer værdierne fra den indekserede kolonne i sorteret rækkefølge, organiseret i et lavt træ af sider.
- Hver bladnode indeholder indeksnøgler samt en peger til den faktiske række i tabellen.
- Træet forbliver balanceret, så hvert opslag kun berører få sider, uanset tabelstørrelsen.
Et opslag bevæger sig fra roden ned til et blad på omtrent log(N) trin i stedet for at scanne alle N rækker.
Opret dit første indeks
Du opretter et B-træ-indeks med CREATE INDEX. Navngiv det tydeligt, så den, der gennemgår koden, straks kan se tabellen og kolonnerne.
Når indekset findes, kan en forespørgsel, der filtrerer på email, bruge det til at finde den matchende række med kun få læsninger af sider i stedet for en fuld scanning.
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';Operationer, som et B-træ gør hurtigere
Fordi et B-træ holder værdierne sorteret, gør det langt mere end eksakte match hurtigere. Interviewere bliver ofte imponerede, når du nævner disse præcist:
- Lighed:
WHERE email = ? - Interval:
WHERE age > 30,BETWEEN,<,>= - Præfiks-matchning:
WHERE name LIKE 'Ada%'(men IKKE'%da') - ORDER BY på den indekserede kolonne, så en separat sortering undgås
- MIN/MAX, eftersom de ligger i hver sin ende af den sorterede struktur
Gennemgået eksempel: Intervalforespørgsel
Forestil dig en orders-tabel med millioner af rækker. En rapporteringsforespørgsel skal hente nyere ordrer. Med et indeks på created_at finder databasemotoren begyndelsen af intervallet i det sorterede indeks og bevæger sig kun så langt frem, som det er nødvendigt.
Indekset omdanner en fuld tabelscanning til en afgrænset intervalscanning, der kun læser det relevante udsnit.
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';Indekser hjælper også med sortering
Et ofte overset punkt er, at databasemotoren kan returnere rækkerne i indeksrækkefølge og springe et separat sorteringstrin over, fordi indekset allerede er sorteret. Det er vigtigt for ORDER BY og især for sideinddeling med top-N.
Hvis du sorterer efter en kolonne, der har et matchende indeks, kan optimeringsprogrammet læse indekset i rækkefølge og stoppe tidligt, når det har hentet nok rækker.
-- 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;Den skjulte omkostning: heap-opslaget
Et normalt B-træ-indeks gemmer kun den indekserede kolonne samt en peger til rækken. Når databasemotoren har fundet de matchende poster, skal den derfor stadig gå til tabellen (heap'en) for at læse de andre kolonner, du valgte.
Dette ekstra hop er et heap-opslag. Det er billigt for få rækker, men dyrt, når en forespørgsel matcher mange rækker. Det er en af grundene til, at et indeks med lav selektivitet nogle gange ignoreres. (Senere ser du, hvordan dækkende indekser løser dette.)
Bekræft, at indekset bruges
Påstå aldrig, at et indeks bruges, uden at bevise det med EXPLAIN. Ved et interview viser du reel forståelse, når du forklarer planen højt.
Seq Scanbetyder, at indekset IKKE blev brugt.Index ScanellerIndex Seekbetyder, at det blev brugt.
Hvis du har tilføjet et indeks, men stadig ser en sekventiel scanning, har planlæggeren vurderet, at scanningen er billigere, ofte fordi forespørgslen matcher en for stor del af tabellen.
EXPLAIN
SELECT * FROM users WHERE email = 'ada@example.com';
-- Look for: Index Scan using idx_users_emailPrimærnøgler er allerede indekseret
Et almindeligt trickspørgsmål til interviews er, at en erklæring af en PRIMARY KEY- eller UNIQUE-begrænsning automatisk opretter et understøttende B-træ-indeks. Du skal ikke tilføje endnu et indeks på den samme kolonne, og det bør du heller ikke gøre.
Derfor er join-operationer og opslag på primærnøgler allerede hurtige, og derfor er spørgsmålet »skal jeg indeksere id-kolonnen?« normalt en fælde: Det er allerede gjort for dig.
-- This already builds a unique B-Tree index on (id)
CREATE TABLE users (
id BIGINT PRIMARY KEY,
email TEXT UNIQUE
);Sådan formulerer du det til interviewet
Saml det hele i en klar sætning, som intervieweren kan nikke til:
'Et B-træ-indeks er en sorteret, balanceret struktur, der lader databasemotoren finde rækker med log(N) læsninger af sider i stedet for at scanne hele tabellen. Det gør ligheds-, interval-, præfiks- og ORDER BY-operationer på de indekserede kolonner hurtigere, men hvert match kræver stadig et heap-opslag for kolonner, der ikke er i indekset.'
Underbyg det derefter med EXPLAIN. Kombinationen af model og belæg er det, der giver point.
Hurtigt tjek
Afprøv din mentale model af, hvilke operationer et B-træ-indeks gør hurtigere.
Opsummering: B-træ-indekser
De vigtigste pointer, du skal tage med til næste lektion:
- Et B-træ gemmer indekserede værdier sorteret i et balanceret træ, hvilket giver opslag på
log(N). - Det gør ligheds-, interval-, præfiks-LIKE-operationer (med indledende tekst), ORDER BY og MIN/MAX hurtigere.
- Hvert match kræver stadig et heap-opslag for kolonner, der ikke findes i indekset.
- Hvis du omslutter en kolonne i en funktion eller bruger et jokertegn i starten, deaktiveres indekset.
- Verificer altid med
EXPLAIN; PRIMARY KEY- og UNIQUE-begrænsninger indekserer automatisk.
Næste emne er, hvordan du ordner kolonner, når ét indeks dækker flere af dem på én gang.
Lær SQL med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 30
- Lektioner
- 120
Ofte stillede spørgsmål
Er lektionen “B-træ-indekser, og hvordan de hjælper” gratis?
Ja — hele teksten til “B-træ-indekser, og hvordan de hjælper” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Forberedelse til SQL-interview-kurset, skal du opgradere til CoddyKit PRO. Forberedelse til SQL-interview-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “B-træ-indekser, og hvordan de hjælper”?
Hvad et indeks faktisk gemmer, og hvilke operationer det gør hurtigere. Du øver dig i Forberedelse til SQL-interview med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Forberedelse til SQL-interview?
Der kræves ingen tidligere erfaring. Forberedelse til SQL-interview på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “B-træ-indekser, og hvordan de hjælper”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Forberedelse til SQL-interview-lektion?
Ja. Alle Forberedelse til SQL-interview-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- B-træ-indekser, og hvordan de hjælper
- Kolonnerækkefølge i sammensatte indekser
- Dækkende indekser og Index-Only-scanninger
- Når indekser skader: skrivninger og selektivitet