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.
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 queriesBRIN-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?
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
- B-tree- kontra hash-, GiST- och GIN-index
- Sammansatta index och kolumnordning
- Partiella index och uttrycksindex
- Indexunderhåll och indexbloat