Omkostningerne ved at opretholde et indeks (enkeltkolonne eller multikolonne) opvejes næsten altid af præstationsforbedringen, når dette indeks bruges. Det er en lille stigning på hver INSERT
/SLET
, plus en omkostning, hvis værdien af et indekseret felt ændres via OPDATERING
. (
WHERE `vehicles`.`type` IN ('Car')
AND `vehicles`.`user_id` = 10
kræver INDEX(bruger_id, type)
.
Optimeringsværktøjet vil
- opdag, at det indeks er en mulig kandidat,
- tjek da nogle statistikker
- brug enten indekset, eller beslut dig for, at kardinaliteten er dårlig, og scan blot tabellen.
Inkluder indekset; du skal ikke bekymre dig om det.
Jeg bestilte felterne på den måde, ikke (type, bruger_id)
baseret på din IN
, hvilket betyder, at du nogle gange kan have flere værdier for type
.
Hvis alle rækker i tabellen har type ='Bil'
, intet problem. Alt, hvad jeg har sagt, gælder stadig. Spildet ved at inkludere den unødvendige type
er ubetydelig.
Det er bedre at have alle "=" kolonne(r) først i et indeks, derefter højst ét andet felt. Yderligere diskussion her .