sql >> Databáze >  >> RDS >> Mysql

Indexování sloupce s duplicitními hodnotami

Na základě neúplné specifikace bych udělal toto:

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

Tento index by splnil požadavek na index s storeid jako vedoucí kolona. (A víme, že tento požadavek budeme mít, pokud se jedná o InnoDB a storeid je cizí klíč.)

S tak krátkým řádkem tabulky bych pokračoval a udělal z něj krycí index a zahrnul všechny sloupce. Dotazy pak mohou být uspokojeny přímo z indexových stránek bez vyhledávání datových stránek v podkladové tabulce.

Protože víme, že (seedid,storeid) je jedinečný (dán jako PRIMÁRNÍ KLÍČ), známe (storeid,seedid) je také jedinečný, takže bychom mohli index prohlásit za UNIKÁTNÍ.

Existují další možnosti; výše uvedený index nemusíme vytvářet. Místo toho bychom mohli udělat toto:

   CREATE INDEX stock_IX2 ON stock (storeid)

To však zabere téměř stejné množství místa a nebude to pro tolik možných dotazů tak přínosné.

Sekundární index bude obsahovat primární klíč tabulky; takže druhý index bude obsahovat seedid sloupec, daný PRIMÁRNÍM KLÍČEM tabulky. To znamená, že index je ekvivalentní tomuto:

   CREATE INDEX stock_IX3 ON stock (storeid,seedid)

A víme, že kombinace těchto dvou sloupců je jedinečná, takže můžeme zahrnout klíčové slovo UNIQUE

   CREATE UNIQUE INDEX stock_UX4 ON stock (storeid,seedid)

Pokud uděláme EXPLAIN na dotaz ve tvaru

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

pravděpodobně uvidíme operaci prohledávání rozsahu na sekundárním indexu; ale načtení hodnoty stk sloupec bude vyžadovat vyhledání datových stránek v podkladové tabulce. Včetně stk sloupec v sekundárním indexu učiní index pokrývajícím index pro dotaz. S indexem doporučeným jako první v odpovědi očekáváme EXPLAIN výstup zobrazí "Using index".



  1. 5 bezproblémových tipů pro použití příkazu SQL UPDATE s JOIN

  2. Operátor pivotu Oracle

  3. Pohled na chybu skupiny Oracle

  4. Jak analyzovat VARCHAR předaný do uložené procedury v SQL Server?