TakéIndexování, Zaindexování, Indexace stránekPokročilý

Definice

Indexace je proces, při kterém systém zpracuje obsah a uloží ho do datové struktury umožňující rychlé vyhledávání. Ve vyhledávačích jde o zařazení stažené stránky do vyhledávacího indexu, v databázích o vybudování indexu nad sloupcem tabulky. Bez indexace by každý dotaz vyžadoval sekvenční průchod všemi daty.

Kategorie: DatabázeAktualizováno

Nezaměňujte: Indexace znamená v SEO zařazení stránky do indexu vyhledávače, v databázích vybudování pomocné struktury nad sloupcem a ve fulltextových systémech rozklad textu na termy a jejich uložení do invertovaného indexu.

Co se při indexaci s obsahem stane

Indexace vždy převádí data z pořadí, ve kterém přišla, do pořadí, ve kterém se budou hledat. U vyhledávače robot stránku stáhne, vykreslí ji, vytáhne text a odkazy, rozloží text na jednotlivé termy a ke každému termu si poznamená, na kterých adresách se vyskytuje. Výsledkem je invertovaný index: seznam slov, kde ke každému slovu visí seznam dokumentů. Dotaz „modrá bunda“ se pak neprochází miliardami stránek, ale protne dva už hotové seznamy.

V databázi je princip stejný, jen menší. Index nad sloupcem email je zpravidla B-strom, ve kterém jsou hodnoty seřazené a ke každé vede ukazatel na řádek v tabulce. Vyhledání konkrétního e-mailu tak znamená několik skoků stromem místo čtení celé tabulky.

Stažení není totéž co zaindexování

Ve vyhledávačích jsou to dvě oddělené fáze a mezi nimi je filtr. Crawler stránku navštíví (crawling), ale index ji přijme jen tehdy, pokud projde vyhodnocením: není duplicitní vůči jiné adrese, nemá noindex, není blokovaná v robots.txt tak, že se obsah vůbec nedá přečíst, a má dost vlastní hodnoty. Proto se v Search Console běžně objevují stavy typu „prohledáno, ale zatím nezaindexováno“. Pomůže konzistentní kanonická URL a čistá sitemap, ale ani jedno indexaci negarantuje.

Co indexace stojí

Index je zrychlení čtení zaplacené pamětí a zpomalením zápisu. Každý databázový index zabírá místo na disku a při každém INSERT, UPDATE nebo DELETE se musí aktualizovat. Tabulka s deseti indexy zapisuje výrazně pomaleji než tabulka se dvěma. Podobně u vyhledávačů: crawl budget není nekonečný, a když robot tráví čas na filtrovaných variantách výpisu produktů, nedostane se k novým článkům.

Kdy index nepomůže

Index se nepoužije, pokud dotaz pracuje se sloupcem uvnitř funkce (WHERE lower(email) = ... bez odpovídajícího funkčního indexu), pokud je selektivita nízká (sloupec s hodnotami ano/ne u milionu řádků) nebo pokud plánovač usoudí, že sekvenční čtení vyjde levněji. Ověřuje se to příkazem EXPLAIN, ne dohadem.

Přeindexování a fragmentace

Index se časem znehodnocuje: po masivních mazáních zůstávají poloprázdné stránky a statistiky přestávají odpovídat realitě. Řeší to přestavba indexu a aktualizace statistik. U fulltextových enginů se obdobně provádí přeindexace celé kolekce po změně analyzátoru nebo jazykových pravidel.

Fulltextová indexace textu

Mezi surovým textem a indexem stojí analyzátor: rozdělí text na tokeny, sjednotí velikost písmen, odstraní diakritiku, zahodí stopslova a převede slova na základní tvar. Čeština je tady náročná kvůli bohatému skloňování, takže bez lemmatizace nebo stemmeru dotaz „bunda“ nenajde dokument se slovem „bundách“. Analyzátor musí být totožný při indexaci i při dotazu, jinak se termy neshodnou.

Příklady z praxe

  1. Index nad e-shopovou tabulkou objednávek

    Výpis objednávek zákazníka trval nad tabulkou s pěti miliony řádků přes sekundu, protože PostgreSQL četl celou tabulku. Po vytvoření indexu nad sloupcem customer_id klesl dotaz na jednotky milisekund. Kontrola přes EXPLAIN ANALYZE potvrdila přechod ze Seq Scan na Index Scan.

    CREATE INDEX idx_objednavky_zakaznik
      ON objednavky (customer_id, created_at DESC);
    
    EXPLAIN ANALYZE
    SELECT * FROM objednavky
    WHERE customer_id = 42
    ORDER BY created_at DESC
    LIMIT 20;
  2. Filtrované výpisy blokující indexaci e-shopu

    Kategorie s kombinovatelnými filtry vygenerovala desítky tisíc adres typu ?barva=modra&velikost=m, které robot procházel místo nových produktů. Řešením bylo nastavit u filtrovaných variant kanonickou URL na základní kategorii a u nesmyslných kombinací poslat meta robots noindex. Počet zaindexovaných duplicit během několika týdnů klesl a nové produkty se do indexu dostávaly rychleji.

    <link rel="canonical" href="https://eshop.cz/bundy">
    <meta name="robots" content="noindex, follow">

Časté omyly

MýtusPoslal jsem sitemap, takže se stránky zaindexují.
Ve skutečnostiSitemap je pouze návrh, které adresy stojí za návštěvu. Vyhledávač si sám rozhoduje, co do indexu přijme, a stránky s tenkým nebo duplicitním obsahem odmítne bez ohledu na to, že jsou v sitemapě uvedené.
MýtusČím víc indexů v databázi, tím rychlejší aplikace.
Ve skutečnostiKaždý index zrychluje čtení, ale zpomaluje zápis a zabírá místo. Nepoužívané a překrývající se indexy jsou čistá režie, kterou je lepší najít v systémových statistikách a zrušit.
MýtusZákaz v robots.txt zajistí, že se stránka do vyhledávače nedostane.
Ve skutečnostiBlokace v robots.txt zakazuje stažení obsahu, ne zařazení adresy do indexu. Odkazovaná adresa se může v indexu objevit bez popisu. K vyloučení slouží meta značka noindex nebo hlavička X-Robots-Tag, ke které se robot musí umět dostat.

Časté dotazy

Jak dlouho trvá indexace nové stránky?
Indexace nové stránky trvá od několika hodin po několik týdnů a žádný vyhledávač na ni nedává záruku. Rychleji se do indexu dostávají weby, které robot navštěvuje často, mají vnitřní prolinkování a publikují pravidelně. Nová doména bez zpětných odkazů čeká typicky déle. Odeslání adresy přes nástroj pro kontrolu URL v Search Console zařazení urychlí, ale nenahradí kvalitu obsahu. Pokud stránka není zaindexovaná ani po měsíci, obvyklou příčinou je duplicita, tenký obsah nebo technická překážka, nikoli krátký čas.
Jak zjistím, jestli je stránka zaindexovaná?
Zaindexování stránky se ověří v Google Search Console nástrojem pro kontrolu URL, který ukáže aktuální stav včetně důvodu vyloučení. Rychlá orientační kontrola jde přes dotaz site: s konkrétní adresou, ale výsledek je jen přibližný a nezobrazuje důvody. Pro celý web slouží report indexace stránek, kde jsou adresy rozdělené na zaindexované a nezaindexované s uvedeným stavem, například prohledáno bez zaindexování nebo duplicita s odlišnou kanonickou stránkou zvolenou vyhledávačem.
Kolik databázových indexů je na jednu tabulku moc?
Univerzální číslo neexistuje, ale u tabulek s vysokým počtem zápisů se obvykle vyplatí držet počet indexů v jednotkách a každý z nich obhájit konkrétním dotazem z produkce. Praktický postup je vycházet z reálné zátěže: najít nejpomalejší dotazy, ověřit plán přes EXPLAIN a přidat index jen tam, kde plán skutečně změní. Zároveň je vhodné sledovat statistiky použití indexů a nepoužívané rušit, protože stále zpomalují každý zápis a zvětšují zálohy.
Proč mi databáze nepoužila vytvořený index?
Nepoužitý index má obvykle jednu z několika příčin. Dotaz aplikuje na sloupec funkci nebo přetypování, takže hodnoty v indexu neodpovídají porovnávaným. Sloupec má nízkou selektivitu a plánovač usoudí, že přečíst tabulku sekvenčně je levnější. Statistiky jsou zastaralé po hromadné změně dat. Pořadí sloupců ve složeném indexu neodpovídá podmínkám dotazu. Řešením je podívat se na výstup EXPLAIN, aktualizovat statistiky a případně vytvořit funkční index nebo index s jiným pořadím sloupců.

Zdroje

  1. Indexes(otevře se v novém okně)PostgreSQL Global Development Group
  2. Google Search Central Documentation(otevře se v novém okně)Google
  3. Indexes(otevře se v novém okně)MongoDB
  4. Search engine indexing(otevře se v novém okně)Wikipedia
  5. Query Planning(otevře se v novém okně)SQLite

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.