Kolonnerækkefølge i sammensatte indekser
Reglen om venstre præfiks og valg af den rigtige kolonnerækkefølge til en arbejdsbelastning.
Kolonnerækkefølge i sammensatte indekser er en gratis Forberedelse til kodeinterviews-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Forberedelse til kodeinterviews, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Forberedelse til kodeinterviews-kurset indeholder 4 lektioner i alt.
Spørgsmålet om sammensatte indeks
Når du kan forklare et indeks med én kolonne, skruer interviewerne op for sværhedsgraden: 'Du forespørger på customer_id og order_date samtidig. Hvordan vil du indeksere det?' Det forventede svar er et sammensat indeks (indeks med flere kolonner) samt en begrundelse for kolonnerækkefølgen.
Denne lektion lærer dig reglen om det venstre præfiks, den ene idé, der forklarer næsten alle spørgsmål om sammensatte indeks, du nogensinde vil få.
Hvad et sammensat indeks er
Et sammensat indeks indekserer flere kolonner som en ordnet tupel. Posterne sorteres først efter den første kolonne, derefter efter den anden blandt værdier, der er ens, og så videre, præcis som en telefonbog, der er sorteret efter efternavn og derefter fornavn.
Rækkefølgen er enormt vigtig, fordi sorteringsprioriteten følger den kolonnerækkefølge, du erklærer.
CREATE INDEX idx_orders_cust_date
ON orders (customer_id, order_date);Reglen om det venstre præfiks
Den centrale regel er, at et sammensat indeks på (A, B, C) kan bruges til forespørgsler, der filtrerer på et venstre præfiks af disse kolonner:
Aalene: jaA, B: jaA, B, C: jaBalene: NEJB, C: NEJ
Tænk på telefonbogen: Du kan finde alle med efternavnet 'Smith', men du kan ikke effektivt finde alle, der hedder 'John' til fornavn, uanset efternavn, fordi bogen ikke er sorteret på den måde.
Gennemgået eksempel: Match på præfikset
Med indekset på (customer_id, order_date) kan disse forespørgsler bruge indekset, fordi de begynder med customer_id:
Den første bruger kun den førende kolonne. Den anden bruger begge kolonner: først indsnævres resultatet med customer_id, og derefter søges der blandt denne kundes poster, som er sorteret efter dato.
-- Uses the index (leading column)
SELECT * FROM orders WHERE customer_id = 42;
-- Uses the index fully (both columns, in order)
SELECT * FROM orders
WHERE customer_id = 42
AND order_date >= '2026-01-01';Gennemgået eksempel: Præfiks-missere
Denne forespørgsel filtrerer kun på den anden kolonne, så indekset på (customer_id, order_date) kan generelt ikke styre opslaget, fordi posterne ikke er globalt sorteret efter order_date.
Hvis filtrering kun på order_date er et almindeligt mønster, har du brug for et separat indeks, der begynder med order_date.
-- Does NOT use idx_orders_cust_date efficiently
SELECT * FROM orders
WHERE order_date >= '2026-01-01';
-- Fix: an index that leads with order_date
CREATE INDEX idx_orders_date ON orders (order_date);Lighed før interval
En nuancering på seniorniveau er at placere kolonner, der bruges med lighed (=), før kolonner, der bruges med et interval (<, >, BETWEEN). Når indekset først rammer en intervalkolonne, kan det ikke længere bruge senere kolonner til at indsnævre opslaget.
For en forespørgsel som status = 'paid' AND created_at > ? er den rigtige rækkefølge (status, created_at), ikke den omvendte.
-- Query: WHERE status = 'paid' AND created_at > '2026-01-01'
-- Good: equality column first
CREATE INDEX idx_orders_status_created
ON orders (status, created_at);Valg af den førende kolonne
Hvordan vælger du, hvilken kolonne der skal stå først? Interviewere ønsker et svar, der tager udgangspunkt i arbejdsbelastningen:
- Lad den kolonne stå først, som optræder i de fleste forespørgsler, især som et lighedsfilter.
- Foretræk en kolonne med høj selektivitet (mange forskellige værdier), så det første trin udelukker flest rækker.
- Tag hensyn til behov for ORDER BY: Hvis indeksrækkefølgen passer, kan en sortering undgås.
Den førende kolonne er den, der udfører det tungeste filtreringsarbejde på tværs af din faktiske blanding af forespørgsler.
Sammensatte indeks hjælper med sortering
Et sammensat indeks kan også bruges til ORDER BY på et venstre præfiks. Fordi posterne er sorteret efter customer_id og derefter order_date, er en forespørgsel efter én kundes ordrer sorteret efter dato stort set gratis, og der kræves ingen separat sortering.
-- No sort step: the index already supplies this order
SELECT * FROM orders
WHERE customer_id = 42
ORDER BY order_date;Undgå overflødige indeks
Kandidater laver ofte for mange indeks. Hvis du allerede har (customer_id, order_date), er et separat indeks kun på (customer_id) normalt overflødigt, fordi det sammensatte indeks allerede dækker forespørgsler på den første kolonne.
Hvert ekstra indeks koster lagerplads og gør skrivninger langsommere, så målet er det mindste sæt af indekser, der dækker dine forespørgselsmønstre, ikke ét indeks pr. kolonne.
Bevis det med EXPLAIN
Bekræft som altid planlæggerens valg. Når du har oprettet et sammensat indeks, skal du køre EXPLAIN og kontrollere, om det vises som en Index Scan, samt hvor mange rækker det estimerer.
Hvis en forespørgsel med et forkert præfiks falder tilbage til en sekventiel scanning, er det dit bevis på, at kolonnerækkefølgen ikke passer til arbejdsbelastningen. Det er præcis det, du ville forklare til en interviewer.
EXPLAIN
SELECT * FROM orders
WHERE customer_id = 42
AND order_date >= '2026-01-01';Sådan formulerer du det til interviewet
En kort og præcis opsummering:
'Et sammensat indeks er sorteret efter sine kolonner fra venstre mod højre, så det kan bruges til ethvert venstre præfiks af disse kolonner, men ikke til en efterfølgende delmængde. Jeg placerer den kolonne, der filtrerer mest og har høj selektivitet, først, sætter lighedsprædikater før intervalprædikater og tilpasser om muligt indekset til ORDER BY. Derefter verificerer jeg med EXPLAIN.'
Hurtigt tjek
Anvend reglen om venstre præfiks.
Opsummering: rækkefølge i sammensatte indekser
Vigtigste pointer:
- Et sammensat indeks sorteres fra venstre mod højre; det kan kun bruges til et venstre præfiks af kolonnerne.
- Placér den kolonne, der oftest bruges i forespørgsler og har høj selektivitet, først.
- Placér kolonner med lighedsbetingelser før kolonner med områdebetingelser.
- Et matchende præfiks kan også opfylde
ORDER BYuden sortering. - Undgå overflødige enkeltkolonneindekser, som allerede er dækket af et sammensat indeks, og kontrollér med
EXPLAIN.
Næste emne: dækkende indekser, der helt fjerner hentningen fra heapen.
Lær Forberedelse til kodeinterviews med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 90
- Lektioner
- 360
Ofte stillede spørgsmål
Er lektionen “Kolonnerækkefølge i sammensatte indekser” gratis?
Ja — hele teksten til “Kolonnerækkefølge i sammensatte indekser” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Forberedelse til kodeinterviews-kurset, skal du opgradere til CoddyKit PRO. Forberedelse til kodeinterviews-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Kolonnerækkefølge i sammensatte indekser”?
Reglen om venstre præfiks og valg af den rigtige kolonnerækkefølge til en arbejdsbelastning. Du øver dig i Forberedelse til kodeinterviews med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Forberedelse til kodeinterviews?
Der kræves ingen tidligere erfaring. Forberedelse til kodeinterviews på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Kolonnerækkefølge i sammensatte indekser”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Forberedelse til kodeinterviews-lektion?
Ja. Alle Forberedelse til kodeinterviews-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- B-træ-indekser, og hvordan de hjælper
- Kolonnerækkefølge i sammensatte indekser
- Dækkende indekser og Index-Only-scanninger
- Når indekser skader: skrivninger og selektivitet