Indexování v databázích

Indexování je proces vytváření pomocných datových struktur, které 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 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.