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)).
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ärdedate_trunc('day', created_at)för dagliga rapporter(data ->> 'user_id')::BIGINTfö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?
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
- B-tree- kontra hash-, GiST- och GIN-index
- Sammansatta index och kolumnordning
- Partiella index och uttrycksindex
- Indexunderhåll och indexbloat