Takédatabázový indexPokročilý
Definice
Index je pomocná datová struktura, která databázi umožní najít řádky podle hodnoty sloupce bez procházení celé tabulky. Zrychluje čtení, zpomaluje zápis a zabírá místo, takže každý index je vědomý kompromis.
Nezaměňujte: Slovo index má i další významy: pozice prvku v poli, hlavní soubor webu index.html nebo burzovní index. Tady jde o databázovou strukturu.
Proč to funguje
Bez indexu musí databáze při hledání projít každý řádek. S indexem má seřazenou strukturu, ve které se dá půlit interval, takže z milionu řádků se dostane k tomu správnému zhruba dvaceti kroky.
Co to stojí
Každý zápis musí aktualizovat nejen tabulku, ale i všechny její indexy. Tabulka s deseti indexy má proto zápis znatelně dražší. Index navíc zabírá místo na disku i v paměti.
Platí jednoduché pravidlo: index se zakládá kvůli konkrétnímu dotazu. Index, ke kterému neumíte říct, který dotaz obsluhuje, je čistá režie.
Příklady z praxe
Vyhledávání podle e-mailu
Tabulka uživatelů s milionem řádků a dotaz na konkrétní e-mail. Bez indexu projde databáze všechny řádky, s indexem nad sloupcem e-mail najde ten správný prakticky okamžitě.
CREATE UNIQUE INDEX users_email_idx ON users (email);
Časté omyly
- MýtusČím víc indexů, tím rychlejší databáze.
- Ve skutečnostiJen pro čtení, a jen pro dotazy, které index skutečně použijí. Nadbytečné indexy zpomalují každý zápis, zabírají paměť a mohou plánovači zkomplikovat výběr toho správného. Nepoužívaný index je čistá ztráta.
- MýtusIndex nad každým sloupcem ve WHERE stačí.
- Ve skutečnostiU dotazu, který filtruje podle několika sloupců a ještě řadí, bývá jeden dobře poskládaný složený index výrazně účinnější než několik samostatných. Na pořadí sloupců v takovém indexu záleží.
Časté dotazy
- Jak poznám, že dotaz index používá?
- Většina databází nabízí příkaz, který ukáže plán vykonání dotazu, v PostgreSQL a MySQL je to EXPLAIN. V plánu hledáte, jestli se čte přes index, nebo jestli se prochází celá tabulka. Průchod celou tabulkou u velkého dotazu znamená, že index chybí nebo ho nelze použít.
Zdroje
- Indexes(otevře se v novém okně)