SQL
Indeks og optimering
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,UPDATEogDELETEskal 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
- Hent kun det, du skal bruge.
SELECTmed navngivne kolonner frem for*. - Filtrér i databasen, ikke i koden. At hente 10.000 rækker hjem for at beholde 12 er den mest almindelige begynderfejl.
- 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
WHEREgør indekset ubrugeligt.
Læs videre
- JOIN forklaret SQL JOIN forklaret på dansk: inner join, left join og forskellen på dem. Hvorfor du pludselig får flere rækker, end du forventede, og hvordan du undgår det.
- Primærnøgler og fremmednøgler Primærnøgler og fremmednøgler forklaret på dansk med eksempler i SQL. Hvorfor de findes, hvordan de sættes op, og hvad referentiel integritet betyder.
- SELECT - hent data SELECT i SQL forklaret på dansk: kolonner, ORDER BY, DISTINCT og aliasser. Med eksempler og rækkefølgen databasen faktisk udfører delene i.
Senest gennemgået .