SQL Academy · Lektion

B-tree- kontra hash-, GiST- och GIN-index

Jämför de viktigaste indextyperna i PostgreSQL och välj rätt typ för likhets-, intervall-, geometri-, JSON- och fulltextfrågor.

Lektion 1 av 413 steg

B-tree- kontra hash-, GiST- och GIN-index är en gratis lektion i SQL Academy på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för SQL Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i SQL Academy innehåller totalt 4 lektioner.

Översikt över indextyper

PostgreSQL har flera indextyper, som var och en är optimerad för olika åtkomstmönster:

  • B-tree – likhet och intervall (standard)
  • Hash – endast likhet
  • GiST – geometri, fulltextsökning och anpassade typer
  • GIN – sammansatta värden (arrayer, JSONB, fulltextsökning)
  • BRIN – blockintervall – stora, sorterade tabeller
  • SP-GiST – rymdpartitionerade träd

B-tree: standardvalet

Används i 95 % av fallen. Stöder =, <, <=, >, >=, BETWEEN och ORDER BY:

CREATE INDEX users_email_idx ON users(email);
CREATE INDEX orders_created_at_idx ON orders(created_at DESC);

Hash-index

Endast likhetsuppslagningar. Kras säkert sedan PG 10. Mindre och något snabbare än B-tree för ren likhet, men användningsområdet är mycket begränsat:

CREATE INDEX sessions_token_hash ON sessions USING HASH (token);
-- Useful for very high-cardinality equality lookups; usually B-tree is fine.

GiST-index

Generalised Search Tree – pluggbart och med stöd för intervalltyper, geometriska typer, IP-adresser och fulltextsökning:

CREATE INDEX events_during_idx ON events USING GIST (during);
-- 'during' is a tstzrange — finds overlapping ranges efficiently.

CREATE INDEX places_location_idx ON places USING GIST (location);
-- PostGIS geometry — nearest neighbour, intersects.

GIN-index

Generalised Inverted Index – bäst för sammansatta värden där varje element kan motsvara många rader:

CREATE INDEX articles_tags_gin ON articles USING GIN (tags);
-- tags is TEXT[]; query with @> or && operators

CREATE INDEX articles_doc_gin ON articles USING GIN (search_doc);
-- For tsvector full-text search

CREATE INDEX events_data_gin ON events USING GIN (data jsonb_path_ops);
-- For JSONB containment queries

BRIN-index

Block Range INdexes sammanfattar värdeintervall per N sidor. De är mycket små (kilobyte för tabeller på terabyte) men är bara effektiva när data är fysiskt sorterad efter den indexerade kolumnen:

CREATE INDEX events_ts_brin ON events USING BRIN (ts);
-- Excellent for append-only time-series tables.

Jämförelse av storlekar

För en tabell med en miljard rader:

  • B-tree på en BIGINT: cirka 30 GB
  • BRIN på en TIMESTAMPTZ: cirka 1 MB

BRIN är dramatiskt mindre men slår bara B-tree för sekventiella eller sorterade frågor.

Välj indextyp

Beslutsflöde:

  • Likhet + intervall på skalärt värde → B-tree
  • Likhet i en enorm mängd skalära värden → B-tree (Hash endast om du har mätt)
  • Arrayer / JSONB / fulltextsökning → GIN
  • Intervalltyper, geometri, ungefärlig textsökning → GiST
  • En enorm, sorterad tabell som bara fylls på → BRIN

GIN:s avvägningar

GIN är snabbast för frågor av typen "hitta alla rader som innehåller X", men långsammare vid INSERT/UPDATE än B-tree. För tabeller med mycket hög skrivbelastning kan du överväga fastupdate=off för att styra GIN:s väntande lista.

Operator-klasser

Varje indextyp fungerar med specifika operatorer. JSONB använder jsonb_path_ops för mindre och snabbare index som endast stöder innehållsökningar:

CREATE INDEX e_data_gin ON events USING GIN (data jsonb_path_ops);
-- Half the size of default jsonb_ops, supports @> only.

Sammansatta index per typ

Sammansatta B-tree-index använder matchning mot längst till vänster. Sammansatta GIN-index fungerar, men är större; vanligtvis skapar du separata GIN-index för varje kolumn.

Sammanfattning

Välj indextyp efter frågan.

  • B-tree: standard
  • GIN: arrayer/JSONB/fulltextsökning
  • GiST: intervall/geometri/ungefärlig textsökning
  • BRIN: sekventiellt/påfyllnad

Snabbtest

Du indexerar en TEXT[]-kolumn för frågor av typen "innehåller". Vilken indextyp passar?

Gratis att börja

Lär dig SQL med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
46
Lektioner
183

Vanliga frågor

Är lektionen ”B-tree- kontra hash-, GiST- och GIN-index” gratis?

Ja – hela texten till ”B-tree- kontra hash-, GiST- och GIN-index” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i SQL Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i SQL Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”B-tree- kontra hash-, GiST- och GIN-index”?

Jämför de viktigaste indextyperna i PostgreSQL och välj rätt typ för likhets-, intervall-, geometri-, JSON- och fulltextfrågor. Ni övar på SQL Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig SQL Academy?

Du behöver inga förkunskaper. Utbildningen i SQL Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.

Hur lång tid tar lektionen ”B-tree- kontra hash-, GiST- och GIN-index”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här SQL Academy-lektionen?

Ja. Varje SQL Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. B-tree- kontra hash-, GiST- och GIN-index
  2. Sammansatta index och kolumnordning
  3. Partiella index och uttrycksindex
  4. Indexunderhåll och indexbloat
← Tillbaka till SQL Academy