Přednáška 8 INDEXY, POHLEDY
INDEXY INDEX je databázový seznam řazení (sloupce nebo sloupců tabulky), sloužící ke zrychlení vyhledávacích a dotazovacích procesů v databázi, definování unikátní hodnoty sloupce tabulky nebo optimalizaci fulltextového vyhledávání. Tabulka: Index prijmeni: id jmeno prijmeni 1 Marek Vondráček 2 Daniela Poláková 3 Andrea Janišová 9 Jiří Brdička 11 Jan Folprecht Brdička Folprecht Janišová Poláková Vondráček
Funkce indexu Vytvořením indexu MySQL zarezervuje pro požadovaný index určitou část paměťového prostoru a uloží do něj informace o rozmístění hodnot indexovaných sloupců v tabulce. Pokud dojde k dotazu (SELECT), který se týká indexovaných sloupců, není tabulka prohledávána podle toho, jak jsou za sebou řádky uloženy, ale pomocí informací uložených v paměťovém prostoru indexu je přistupováno přímo k relevantním řádkům tabulky. Viz předchozí ukázka.
Druhy indexů v MySQL MySQL podporuje následující indexy: primární klíč, jedinečný (unikátní) index, fulltextový index a ordinální index. CREATE TABLE studenti ( id int(8) NOT NULL auto_increment, jmeno varchar (30) NOT NULL, prijmeni varchar (30) NOT NULL, PRIMARY KEY (id), INDEX (prijmeni) );
Primární klíč Je indexem na poli, kde je každá hodnota jedinečná a žádná z hodnot není NULL. Funkci primárního klíče může zároveň plnit více polí, jejichž kombinace tak vždy musí být jedinečná (např. vazební tabulka). Pokud nemůžeme vybrat jeden nebo více sloupců, jež mohou sloužit jako primární klíč, je dobré jednoduše vytvořit jeden numerický sloupec a nechat MySQL, aby jej naplňoval unikátními daty (AUTO INCREMENT). Primární klíč na sloupci (sloupcích) vytvoříme při tvorbě tabulky. V PHPMyAdmin stačí ve výběrovém rozbalovacím poli Index zvolit hodnotu PRIMARY. Pozor, toto pole nesmíte volit nikdy jako nulové.
Ordinální index Index, který není unikátní - povoluje duplicitní hodnoty. Vždy je dobré jej vytvořit již při vytváření tabulky. Ordinální index by se měl volit v těch případech, kdy se počítá s velkým vytížením tabulky na mnoho záznamů, a u pole, které bude často využíváno za podmínkou WHERE. Ordinální index řadí data alfanumericky. Mohutnost indexu Unikátnost hodnot sloupce (sloupců) indexu. Mohutnost by měla vždy co největší, ideálně 100%.
Unikátní index Fulltextový index Jedinečný (UNIQUE) index nepovoluje žádné duplikáty. Oproti primárnímu klíči, může být v tabulce více unikátních indexů. Používá se pro identifikační záznamy, např. email registrovaného zákazníka. Fulltextový index V tabulkách MyISAM můžeme vytvářet fulltextové indexy na polích typu CHAR, VARCHAR nebo TEXT. Fulltextový index slouží k jednoduchému hledání klíčových slov v textových polích rozsáhlých tabulek.
Vytváření indexů z části pole Pro ordinální indexy je možno: V případě sloupců typu VARCHAR, CHAR, BLOB a TEXT nám MySQL umožňuje vytvořit index, který nepoužívá celé takové pole. Třebaže příjmení studenta může obsahovat až 20 znaků je pravděpodobné, že všechna příjmení se budou lišit již v pěti prvních znacích. Když pro index použijeme tak jen prvních pět znaků, index bude datově menší. Tím by se zrychlila aktualizace i vkládání a navíc to nebude mít žádný vliv na rychlost příkazu SELECT.
Volba indexů - zásady Indexy vytváříme na sloupcích, kde se budou vykonávat nějaké dotazy (nejčastěji na polích v podmínce WHERE). Vytváříme indexy na polích, které slouží pro spojení s jinými tabulkami. Vytváříme indexy, které vracejí co nejmenší možný počet řádků (zde je nejlepší primární klíč, protože primární klíč je přiřazen jednomu záznamu). Jinak řečeno, vytváříme indexy s co možná největší mohutností. Pokud je to možné, lépe volit numerické indexy (ve srovnání s řetězcovými) umožňují rychlejší přístup k datům. Používáme krátké indexy (indexujeme např. jen prvních 10 znaků jména a nikoli celé pole). Nevytváříme příliš mnoho indexů. Index zvětšuje čas, potřebný pro aktualizaci a vložení záznamu. Pokud daný index slouží jen zřídkakdy používanému dotazu, který klidně může běžet trochu pomaleji, zvažte možnost takový index vůbec nevytvářet.
POHLEDY Pohled je jakýmsi přechodem (uloženou definicí výběrových dotazů SELECT) mezi trvalou základní tabulkou a odvozenou tabulkou. Pro jednoduchost si lze pohled představit jako výsledek výběrového dotazu, který je trvale uložen v databázi a obsahuje vždy aktuální data podkladových tabulek. Podkladová (zdrojová) tabulka – klasická tabulka databáze. Pohled může obsahovat data z jedné či více tabulek a může obsahovat i odvozené atributy, které se přímo v podkladových tabulkách nevyskytují (např. agregační funkce).
Proč POHLEDY Jednou z hlavních výhod pohledu je to, že můžeme definovat složité dotazy a uložit je v definici pohledu. Takto můžeme podle potřeby volat pohledy místo opětovného vytváření dotazů. Prezentace dat uživatelům bez potřeby poskytování nadbytečných nebo nežádoucích dat. To znamená vytvořit pohled takový, který vrací pouze ty sloupce, které jsou nezbytné pro aktuální zobrazení. Shrnutí: Omezení počtu vracených sloupců Omezení počtu vracených řádků Omezení neefektivních spojení Jednodušší aktualizace s kontrolou integrity
Vytvoření pohledu Syntaxe: CREATE [OR REPLACE] VIEW jmeno_pohledu [(seznam_atributu_pohledu)] // jaké bude mít pohled sloupce AS dotaz_vybirajici_data [WITH [CASCADED │ LOCAL] CHECK OPTION] Seznam atributů představuje výčet sloupců, které chceme do pohledu zařadit. Pojmenovat je můžeme různě, ovšem jejich počet musí být shodný s počtem vybíraných atributů z podkladových tabulek. Za klauzulí AS následuje výběrový dotaz, který může obsahovat i složitá spojení z více tabulek.
Příklad pohledu Podkladová tabulka zbozi: Tabulka zobrazuje více sloupců, které mohou být zbytečné. Uvažujme velmi zjednodušený příklad. Skladník potřebuje v daný moment znát pouze regál, ve kterém se zboží nachází, název zboží a počet. Vytvoříme pro něj tedy triviální pohled: zbozi_id regal nazev var_nazev pocet 1 4 Nůž NULL 1500 2 5 Lžíce 1660 3 6 Vidlička
Pohled CREATE VIEW prehled (polozka, regal, pocet) AS SELECT nazev, regal, pocet FROM zbozi; POHLED prehled: polozka regal pocet Nůž 4 1500 Lžíce 5 1660 Vidlička 6
Aktualizovatelné pohledy Některé pohledy jsou aktualizovatelné. Jinými slovy můžeme pohled používat k úpravám dat v podkladové tabulce, z níž je pohled odvozen. Za jistých okolností (nejčastěji v případě, že pohled je vytvořen pouze z jedné podkladové tab.) tak můžeme používat i příkazy INSERT, UPDATE a DELETE. Uvažujme předchozí příklad: Jaké operace bychom teoreticky mohli provádět? Pole zbozi_id je automaticky inkrementované.
Příklad Tabulka sklady: Tabulka zbozi: sklad_id nazev dvere 1 Kuchyňské potřeby A55 2 Čistící prostředky C10 3 Zahradní doplňky H122 Tabulka sklady: Tabulka zbozi: zbozi_id sklad_id nazev var_nazev pocet 10 1 Nože NULL 1000 20 Vidličky 1100 30 Lžičky 40 2 Savo 200 50 3 Hadice 60 Motyky
Úkol Napište SQL kód pro vytvoření pohledu prehled, který bude skladníkovi uvádět data v následující struktuře: Pohled prehled: zbozi dvere_sklad pocet Nože A55 – Kuchyňské potřeby 1000 Vidličky 1100 Lžičky Savo C10 – Čistící prostředky 200 Hadice H122 – Zahradní doplňky 40 Motyky 10
SQL kód CREATE VIEW prehled (zbozi, dvere_sklad, pocet) AS SELECT zbozi.nazev, CONCAT(dvere, ' - ', sklady.nazev), pocet FROM zbozi NATURAL JOIN sklady Otázka: Je tento pohled aktualizovatelný?
Aktulizace pohledů Pokud pohled odvozuje data z více než jedné podkladových tabulek, nelze na něm provádět operace vložení INSERT ani odstranění DELETE. V některých případech lze ale provádět operace UPDATE. Kontrolu aktualizace dat v definici pohledu s klauzulí WHERE můžeme zajistit přidáním další klauzule WITH CHECK OPTION. Více ve skriptech a doplňku k přednášce.
Zapamatujte si Co je to INDEX Typy INDEXŮ v MySQL Primární klíč, Unikátní index, Ordinální index, Fulltextový index Zásady volby indexů Pohledy Vytvoření pohledu Účel pohledu Aktualizovatelnost pohledu Klauzule WITH CHECK OPTION