Spring til indhold
Academi.dk

SQL

Indeks og optimering

Øvet DA↔EN-ordliste

Et indeks er en sorteret opslagsliste, databasen kan bruge til at finde rækker uden at læse hele tabellen. Det gør søgninger hurtigere og skrivninger en anelse langsommere, og det virker kun, hvis forespørgslen er skrevet, så indekset kan bruges.

Forudsætter, at du har set join forklaret .

Stikordsregistret bagest i bogen

Skal du finde alle sider, der nævner “normalisering”, kan du læse hele bogen igennem, eller du kan slå op i registret. Et indeks er registret.

Uden indeks laver databasen en fuld tabelgennemgang: den læser hver eneste række og tjekker, om den passer. Med tusind rækker er det ligegyldigt. Med en million er det forskellen på et millisekund og flere sekunder.

CREATE INDEX ix_ordre_kunde ON ordre (kunde_id);

Hvad der allerede er indekseret

  • Primærnøglen. Altid, automatisk.
  • Kolonner med UNIQUE. Også automatisk. Det er sådan, unikheden håndhæves.
  • Fremmednøgler. Ikke nødvendigvis. I flere databasesystemer skal du selv oprette indekset, og det er en af de hyppigste årsager til, at et join er langsomt.

Hvor det hjælper

Indekser er værd at overveje på:

  • Kolonner, du ofte filtrerer på i WHERE.
  • Kolonner, du joiner på, altså fremmednøglerne.
  • Kolonner, du ofte sorterer efter.

Og de hjælper mest, når kolonnen er selektiv: et indeks på email er godt, fordi hver værdi peger på få rækker. Et indeks på koen med to mulige værdier er næsten værdiløst. Databasen skal alligevel læse halvdelen af tabellen.

Prisen

Et indeks er ikke gratis:

  • Hver INSERT, UPDATE og DELETE skal også opdatere indekset.
  • Det fylder på disken.
  • Ti indekser på en tabel, der skrives meget til, gør systemet langsommere, ikke hurtigere.

Derfor: opret et indeks, fordi du har målt et problem, ikke for en sikkerheds skyld.

Find ud af, hvorfor det er langsomt

Alle databaser kan vise en forespørgselsplan: hvordan de har tænkt sig at udføre din forespørgsel. I MS SQL Server hedder det den estimerede udførelsesplan; andre systemer bruger EXPLAIN foran forespørgslen.

Det, du kigger efter, er ordet scan på en stor tabel. Står der seek, bruger den et indeks. Det er hele den analyse, der forventes i et førsteårsprojekt, og det er langt mere overbevisende at skrive “vi så en table scan på 400.000 rækker, tilføjede et indeks, og gik fra 2,1 s til 30 ms” end at skrive, at I “optimerede databasen”.

Andre ting, der gør mere end indekser

  1. Hent kun det, du skal bruge. SELECT med navngivne kolonner frem for *.
  2. Filtrér i databasen, ikke i koden. At hente 10.000 rækker hjem for at beholde 12 er den mest almindelige begynderfejl.
  3. Undgå en forespørgsel pr. række. Et join er én tur til databasen; hundrede opslag i en løkke er hundrede.

Det sidste punkt er værd at lede efter i jeres eget projekt. Det er næsten altid der, den rigtige optimering ligger.

Kort opsamling

  • Et indeks er en sorteret opslagsliste; uden det læses hele tabellen.
  • Primærnøgler er indekserede, fremmednøgler ikke altid.
  • Indekser koster ved skrivning. Opret dem, hvor der er målt et behov.
  • En funktion om kolonnen i WHERE gør indekset ubrugeligt.

Læs videre

Senest gennemgået .