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

Indeksering af en kolonne med duplikerede værdier

Baseret på den ufuldstændige specifikation ville jeg gøre dette:

   CREATE UNIQUE INDEX stock_UX1 ON stock (storeid,seedid,stk)

Dette indeks ville opfylde kravet om et indeks med storeid som den ledende kolonne. (Og vi ved vil have det krav, hvis dette er InnoDB og storeid er en fremmednøgle.)

Med så kort en tabelrække ville jeg gå videre og gøre den til et dækkende indeks og inkludere alle kolonnerne. Så kan forespørgsler opfyldes direkte fra indekssiderne uden opslag til datasider i den underliggende tabel.

Da vi ved det (seedid,storeid) er unik (angivet som PRIMÆR NØGLE), kender vi (storeid,seedid) er også unik, så vi kan lige så godt erklære indekset for at være UNIKT.

Der er andre valg; vi behøver ikke oprette det indeks ovenfor. Vi kunne bare gøre dette i stedet:

   CREATE INDEX stock_IX2 ON stock (storeid)

Men det vil bruge næsten den samme mængde plads og ikke være så gavnligt for så mange mulige forespørgsler.

Det sekundære indeks vil indeholde tabellens primære nøgle; så det andet indeks vil inkludere seedid kolonne, givet den PRIMÆRE NØGLE i tabellen. Det vil sige, at indekset svarer til dette:

   CREATE INDEX stock_IX3 ON stock (storeid,seedid)

Og vi ved, at kombinationen af ​​disse to kolonner er unik, så vi kan inkludere nøgleordet UNIQUE

   CREATE UNIQUE INDEX stock_UX4 ON stock (storeid,seedid)

Hvis vi laver en EXPLAIN på en forespørgsel i formen

  EXPLAIN
  SELECT t.storeid
       , t.seedid
       , t.stk 
    FROM stock t 
   WHERE t.storeid = 'foo'

vi vil sandsynligvis se en rækkeviddescanningsoperation på det sekundære indeks; men henter værdien af ​​stk kolonne vil kræve opslag til datasiderne i den underliggende tabel. Herunder stk kolonne i det sekundære indeks vil gøre indekset til en dækkende indeks for forespørgslen. Med det indeks, der først anbefales i svaret, forventer vi EXPLAIN output for at vise "Using index".



  1. Perl DBI - kør SQL Script med flere sætninger

  2. MySQL ConnectorJ med flere SQL-sætninger

  3. Sender bordnavnet til markøren

  4. Mysql count returnerer nul, hvis der ikke findes nogen post