====== Indexování v databázích ====== **Indexování** je proces vytváření pomocných datových struktur, které [[rdbms|databázovému stroji]] umožňují najít konkrétní řádky v tabulce bez nutnosti procházet každý jednotlivý záznam (tzv. Full Table Scan). Bez indexů by vyhledávání v milionech záznamů trvalo sekundy nebo i minuty; s indexem je to otázka milisekund. ---- ====== Jak index funguje? ====== Představte si tabulku "Uzivatele" s 10 miliony řádků. Chcete najít uživatele podle e-mailu: * **Bez indexu:** Databáze musí přečíst všech 10 000 000 řádků z disku a porovnat e-mail u každého z nich. * **S indexem:** Databáze se podívá do samostatné, seřazené struktury (indexu), kde jsou e-maily uloženy spolu s "ukazateli" na konkrétní místa na disku. ===== Datové struktury: B-Tree ===== Většina moderních databází (jako [[mysql|MySQL]] nebo PostgreSQL) používá pro indexy strukturu zvanou **B-Strom (B-Tree)**. Tato struktura udržuje data seřazená a umožňuje vyhledávání s logaritmickou složitostí. To znamená, že i když se počet dat zdvojnásobí, počet kroků k nalezení záznamu se zvýší jen o jeden. ---- ====== Typy indexů ====== ^ Typ ^ Popis ^ | **Primární index** | Automaticky vytvořen pro primární klíč tabulky. Zajišťuje unikátnost. | | **Unikátní index** | Zajišťuje, že ve sloupci nebudou dvě stejné hodnoty (např. e-mail nebo rodné číslo). | | **Složený index** | Index vytvořený nad více sloupci najednou (např. Prijmeni + Jmeno). | | **Full-text index** | Speciální index pro vyhledávání slov uvnitř dlouhých textů (článků). | ---- ====== "Něco za něco": Cena za indexování ====== Indexy nejsou "zadarmo". I když extrémně zrychlují čtení (**Read**), mají negativní dopady na jiné operace: 1. **Zpomalení zápisu (Write):** Při každém příkazu ''INSERT'', ''UPDATE'' nebo ''DELETE'' musí databáze aktualizovat nejen samotnou tabulku, ale i všechny přidružené indexy. 2. **Spotřeba místa:** Indexy jsou samostatné struktury uložené na disku. U velkých tabulek mohou indexy zabírat stejně nebo i více místa než samotná data. ---- ====== Kdy indexovat a kdy ne? ====== **Indexujte, pokud:** * Sloupec často používáte v podmínkách ''WHERE''. * Sloupec používáte k propojování tabulek (''JOIN''). * Sloupec používáte pro řazení (''ORDER BY''). **Neindexujte, pokud:** * Tabulka je velmi malá (vyhledávání v celém souboru je rychlejší než práce s indexem). * Sloupec obsahuje velmi málo unikátních hodnot (např. sloupec "Pohlavi"). * Do tabulky se neustále zapisuje obrovské množství dat a čtení je vzácné. ---- //Související pojmy: SQL, RDBMS, MySQL, CRUD, B-Tree, Latence, Databáze.//