Sammensatte indekser og kolonnerekkefølge
Velg kolonnerekkefølgen for sammensatte indekser, forstå regelen om venstreprefiks, og utform indekser som dekker flere spørringer.
Sammensatte indekser og kolonnerekkefølge er en gratis leksjon i SQL Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i SQL Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i SQL Academy inneholder totalt 4 leksjoner.
Hva er en sammensatt indeks
En indeks på mer enn én kolonne. PostgreSQLs B-tree-indekser kan indeksere opptil 32 kolonner; i praksis er 2–4 vanlig.
CREATE INDEX orders_user_created_idx ON orders(user_id, created_at DESC);Hvorfor bruke sammensatte indekser
To scenarioer:
- Spørringen filtrerer på flere kolonner samtidig
- Spørringen filtrerer på én kolonne og sorterer etter en annen
Regelen om venstre prefiks
En indeks på (a, b, c) kan brukes til:
WHERE a = ?WHERE a = ? AND b = ?WHERE a = ? AND b = ? AND c = ?
Den kan IKKE brukes til WHERE b = ? alene eller WHERE c = ?.
Rekkefølgen har betydning
Plasser kolonnen som er mest selektiv OG filtreres oftest, først. Likhetskolonner skal komme før intervallkolonner:
CREATE INDEX orders_user_total_idx ON orders(user_id, total);
-- Best for: WHERE user_id = 42 AND total > 100
-- Also OK: WHERE user_id = 42
-- Useless: WHERE total > 100 (without user_id)Likhet kontra intervall
Likhetspredikater bruker indeksen effektivt; intervaller kan også bruke den, men begrenser den videre nytten. Likhetskolonner bør komme først:
-- Index: (status, created_at)
WHERE status = 'paid' AND created_at >= ... -- both columns used
WHERE created_at >= ... AND status = 'paid' -- index used for status, range scan on created_atIndeksrekkefølge = sorteringsrekkefølge
En indeks på (user_id, created_at DESC) håndterer «brukerens bestillinger, nyeste først» uten et eget sorteringstrinn:
EXPLAIN ANALYZE
SELECT * FROM orders
WHERE user_id = 42
ORDER BY created_at DESC LIMIT 10;
-- Index Scan, no Sort node neededInkludere kolonner som ikke er nøkler (INCLUDE)
PG 11+ støtter INCLUDE for «dekkende» indekser – ekstra kolonner som lagres i bladnodene, men ikke brukes til sortering:
CREATE INDEX orders_user_idx ON orders(user_id)
INCLUDE (total, status);
-- Enables Index-Only Scan for queries that need just these columns.Når De IKKE bør lage sammensatte indekser
Hvis kolonnene spørres etter uavhengig av hverandre, kan to enkeltkolonneindekser håndtere flere spørringer. Sammensatte indekser bytter fleksibilitet mot at «én spørring har alt».
Kombinasjon av bitmapindekser
PostgreSQL kan kombinere flere enkeltkolonneindekser via Bitmap Index Scan:
EXPLAIN ANALYZE
SELECT * FROM orders WHERE user_id = 42 AND status = 'paid';
-- BitmapAnd of two index scans — works without a composite, but slower than the right composite.Vær oppmerksom på indeksoppblåsing
Sammensatte indekser er bredere. Bredere indekser = større filer = mindre av indeksen får plass i hurtigbufferet. Vær bevisst.
Valg av kolonnerekkefølge — et gjennomarbeidet eksempel
Spørring: «bestillinger for én bruker i et datointervall, sortert etter dato».
-- Index design:
CREATE INDEX orders_user_created_idx
ON orders(user_id, created_at DESC);
-- Query (efficiently uses the index):
SELECT * FROM orders
WHERE user_id = 42
AND created_at >= NOW() - INTERVAL '30 days'
ORDER BY created_at DESC LIMIT 10;Oppsummering
Sammensatte indekser håndterer filtrering på flere kolonner og unngår sorteringstrinn.
- Venstre-prefiksregelen
- Likhetskolonner først
- INCLUDE for kolonner som bare skal dekkes
- To enkeltindekser kontra én sammensatt indeks — avhenger av spørringsmiksen
Hurtigsjekk
De har en indeks på (user_id, status, created_at). Hvilken spørring kan IKKE bruke den effektivt?
Lær deg SQL med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 46
- Leksjoner
- 183
Ofte stilte spørsmål
Er leksjonen «Sammensatte indekser og kolonnerekkefølge» gratis?
Ja – hele teksten i «Sammensatte indekser og kolonnerekkefølge» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av SQL Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i SQL Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Sammensatte indekser og kolonnerekkefølge»?
Velg kolonnerekkefølgen for sammensatte indekser, forstå regelen om venstreprefiks, og utform indekser som dekker flere spørringer. Du øver på SQL Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med SQL Academy?
Ingen tidligere erfaring er nødvendig. SQL Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «Sammensatte indekser og kolonnerekkefølge»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne SQL Academy-leksjonen?
Ja. Alle SQL Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- B-tree-, hash-, GiST- og GIN-indekser
- Sammensatte indekser og kolonnerekkefølge
- Partielle indekser og uttrykksindekser
- Indeksvedlikehold og oppblåsing