sql >> Database teknologi >  >> RDS >> Mysql

Vil et sammensat indeks med en anden kolonne med lav kardinalitet påvirke ydeevnen nok til, at det bør bruges?

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 . (OPDATERING tilfælde er sjældent.) Så du skal ikke bekymre dig om omkostningerne ved at "vedligeholde et sammensat indeks".

WHERE `vehicles`.`type` IN ('Car')
  AND `vehicles`.`user_id` = 10

kræver INDEX(bruger_id, type) .

Optimeringsværktøjet vil

  1. opdag, at det indeks er en mulig kandidat,
  2. tjek da nogle statistikker
  3. 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 .




  1. Sådan ændres mysql-dato til Ago i php

  2. INNODB kaskade ved sletning og opdatering

  3. Sådan bruger du pandaer til at lave upsert i SqlAlchemy

  4. Få alle objekter uden loop i OOP MySQLi