SQL Academy · Lektion

Partiella index och uttrycksindex

Indexera bara de rader Ni behöver med WHERE-villkor och indexera beräknade uttryck (lower(email), date_trunc('day', ts)).

Lektion 3 av 413 steg

Partiella index och uttrycksindex är en gratis lektion i SQL Academy på CoddyKit. Detta är lektion 3 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.

Partiellt index: indexera en delmängd

Ett partiellt index omfattar endast rader som matchar en WHERE-sats när indexet skapas. Det är mindre, snabbare och utmärkt för den vanligaste frågan:

CREATE INDEX users_active_email_idx
  ON users(email)
  WHERE deleted_at IS NULL;

När partiella index är effektiva

Använd dem när:

  • Du alltid filtrerar med samma predikat (till exempel mjukradering)
  • Ett värde dominerar kolumnen (till exempel att 95 % av raderna har status='closed')
  • Du vill ha ett litet, aktivt index i cacheminnet

Exempel: aktiva sessioner

De flesta sessioner har löpt ut; endast aktiva sessioner efterfrågas:

CREATE INDEX sessions_active_idx ON sessions(user_id)
  WHERE expires_at > NOW();
-- Caveat: planner can't use NOW() in the index predicate — use a fixed timestamp
-- and reindex periodically, OR use a boolean column.

Bättre: använd ett stabilt predikat

Indexpredikatet måste vara oföränderligt. Tidsberoende uttryck (NOW()) är inte godkända. Använd i stället en kolumn som is_active:

CREATE INDEX sessions_active_idx ON sessions(user_id)
  WHERE is_active = true;

-- The query must use the same predicate to match the index:
SELECT * FROM sessions WHERE is_active = true AND user_id = 42;

Uttrycksindex

Indexera en funktion av en kolumn:

CREATE INDEX users_email_lower_idx ON users(LOWER(email));

SELECT * FROM users WHERE LOWER(email) = LOWER('Alice@Example.com');
-- Uses the expression index.

Vanliga uttrycksindex

  • LOWER(email) för skiftlägesokänslig sökning
  • (price * tax_rate) för sortering efter beräknat värde
  • date_trunc('day', created_at) för dagliga rapporter
  • (data ->> 'user_id')::BIGINT för extrahering från JSONB

Uttrycket måste vara IMMUTABLE

Uttrycket måste vara markerat som IMMUTABLE — resultatet får endast bero på indata. RANDOM(), NOW() och CURRENT_USER är inte godkända.

Kombination av partiellt index och uttrycksindex

Båda kan kombineras:

CREATE INDEX articles_active_title_idx
  ON articles(LOWER(title))
  WHERE published_at IS NOT NULL;

Unika partiella index

Det klassiska mönstret för "en aktiv rad":

CREATE UNIQUE INDEX users_one_active_email
  ON users(email)
  WHERE deleted_at IS NULL;

-- Same email can exist many times in deleted users, but only once active.

Indexpredikatet måste matcha frågan

Frågeplaneraren använder endast det partiella indexet när frågans WHERE-sats "innebär" indexpredikatet:

-- Index:  WHERE is_active = true
-- Match:  WHERE is_active = true AND user_id = 42       ✓
-- Match:  WHERE is_active AND user_id = 42             ✓
-- No:     WHERE user_id = 42                           ✗
-- No:     WHERE is_active IS NOT FALSE                 ✗ (logically same but planner may not realise)

Överanvänd dem inte

Många partiella index som täcker åtskilda delmängder kan göra skrivningar långsammare (varje INSERT måste uppdatera alla relevanta index). Använd dem sparsamt för ofta förekommande frågor.

Sammanfattning

Partiella index och uttrycksindex ger mer funktion per byte.

  • Partiella: indexera endast den delmängd du efterfrågar
  • Uttryck: indexera beräknade värden
  • Båda kräver IMMUTABLE-predikat
  • Frågan måste använda samma predikat för att matcha

Snabbkontroll

Du vill göra skiftlägesokänsliga uppslagningar med e-postadress. Vilket index är mest effektivt?

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 ”Partiella index och uttrycksindex” gratis?

Ja – hela texten till ”Partiella index och uttrycksindex” 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 ”Partiella index och uttrycksindex”?

Indexera bara de rader Ni behöver med WHERE-villkor och indexera beräknade uttryck (lower(email), date_trunc('day', ts)). 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 3 av 4.

Hur lång tid tar lektionen ”Partiella index och uttrycksindex”?

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