Index (databáze)

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 10. května 2020; kontroly vyžadují 7 úprav .

Index ( anglicky  index ) – databázový objekt vytvořený za účelem zlepšení výkonu načítání dat . Tabulky v databázi mohou mít velký počet řádků, které jsou uloženy v libovolném pořadí, a jejich hledání podle daného kritéria postupným prohledáváním tabulky řádek po řádku může trvat dlouho. Index je tvořen z hodnot jednoho nebo více sloupců tabulky a ukazatelů na odpovídající řádky tabulky a umožňuje tak vyhledávat řádky, které splňují kritéria vyhledávání. Zrychlení práce pomocí indexů je dosaženo především díky tomu, že index má strukturu optimalizovanou pro vyhledávání – například vyvážený strom .

Některé DBMS rozšiřují možnosti indexů zavedením možnosti vytváření indexů na sloupcích zobrazení [1] nebo indexů na výrazech. [2] Například index může být vytvořen výrazem upper(last_name)a bude podle toho ukládat odkazy, jejichž klíčem bude hodnota pole last_namenapsaná velkými písmeny. Kromě toho lze indexy deklarovat jako jedinečné nebo nejedinečné. Jedinečný index implementuje omezení integrity na tabulku, čímž eliminuje možnost vkládání duplicitních hodnot.

Architektura

Existují dva typy indexů: seskupený a neshlukovaný. Pokud existuje seskupený index, jsou řádky tabulky seřazeny podle hodnoty klíče indexu. Pokud tabulka nemá seskupený index, nazývá se tabulka halda [3] . Neklastrovaný index vytvořený na takové tabulce obsahuje pouze ukazatele na záznamy tabulky. Na jednu tabulku může být pouze jeden seskupený index, ale každá tabulka může mít několik různých neshlukovaných indexů, z nichž každý definuje své vlastní pořadí záznamů.

Indexy mohou být implementovány různými strukturami. Nejčastěji používané jsou B*-stromy , B+-stromy , B-stromy a hashe .

Posloupnost sloupců ve složeném indexu

Pořadí, ve kterém se sloupce objeví ve složeném indexu, je docela důležité. Jde o to, že je možné získat datovou sadu pro dotaz, který ovlivňuje pouze první z indexovaných sloupců. Ve většině DBMS je však nemožné nebo neefektivní získat data pouze ve druhém a dalších indexovaných sloupcích (žádná omezení pro první sloupec)

Představte si například telefonní seznam seřazený nejprve podle města, pak podle příjmení a poté podle jména. Pokud znáte město, můžete snadno najít všechna telefonní čísla v daném městě. V takovém adresáři však bude velmi časově náročné najít všechny telefony zaznamenané pro určité příjmení - k tomu se musíte podívat do sekce každého města a tam hledat požadované příjmení. Některé DBMS tuto práci dělají, jiné takový index prostě nepoužívají.

Výkon

Pro optimální výkon dotazů se indexy obvykle vytvářejí ve sloupcích tabulky, které se často používají v dotazech. V jedné tabulce lze vytvořit více indexů. Zvýšení počtu indexů však zpomaluje operace přidávání, aktualizace a odstraňování řádků tabulky, protože samotné indexy se musí aktualizovat. Indexy navíc zabírají další paměť, takže před vytvořením indexu byste se měli ujistit, že očekávané zvýšení výkonu pro dotazy převáží nad dodatečnou režií prostředků vašeho počítače na údržbu indexu.

Omezení

Indexy jsou užitečné pro mnoho aplikací, ale jejich použití má svá omezení. Vezměte tento SQL dotaz :

SELECT jméno FROM lidí WHERE příjmení = ' Frankenstein ' ;

Pro provedení takového dotazu bez indexu musí DBMS prozkoumat pole last_namev každém řádku tabulky (tento mechanismus je známý jako „hrubá síla“ nebo „skenování celé tabulky“ a může být v plánu zobrazen jako PŘIROZENÝ). Při použití indexu DBMS jednoduše prochází B-strom, dokud nenajde záznam „Frankenstein“. Takový průchod vyžaduje mnohem méně prostředků než úplné prohledání tabulky.

Nyní si vezměme tento dotaz:

SELECT email_address FROM customers WHERE email_address LIKE '%@yahoo.com' ;

Tento dotaz by měl najít všechny zákazníky, jejichž e-mail končí na @yahoo.com, ale i když email_addressje ve sloupci index, DBMS bude stále používat úplné prohledání tabulky. Je to proto, že indexy jsou postaveny na předpokladu, že slova/znaky jdou zleva doprava. Použití zástupného znaku na začátku vyhledávací podmínky zabrání DBMS v použití B-stromu vyhledávání. V mnoha DBMS lze tento problém vyřešit vytvořením dalšího indexu pomocí výrazu reverse(email_address)a vytvořením dotazu jako:

SELECT email_address FROM customers WHERE reverse ( email_address ) LIKE reverse ( '%@yahoo.com' );

V tomto případě se zástupný znak objeví na pozici zcela vpravo ( moc.oohay@%), což nevylučuje použití indexu na reverse(email_address).

Řídký a hustý index

Obecně je index v databázích soubor s posloupností párů klíčů a ukazatelů. [4] Myšlenka použití indexů vzešla ze skutečnosti, že moderní databáze jsou příliš masivní na to, aby se vešly do hlavní paměti. Data obvykle rozdělujeme do bloků a data v paměti přidělujeme blok po bloku. Hledání záznamu v databázi však může trvat dlouho. Na druhou stranu je indexový soubor nebo indexový blok mnohem menší než datový blok a vejde se do vyrovnávací paměti hlavní paměti, což urychluje vyhledávání záznamů.

Řídký  index se vyznačuje tím, že každý klíč je spojen s určitým ukazatelem bloku v seřazeném datovém souboru.

Hustý index se zase liší v tom, že každý klíč je spojen se specifickým ukazatelem na záznam v seřazeném datovém souboru . 

V seskupených indexech s duplicitními klíči ukazuje řídký index na nejmenší klíč v každém bloku, zatímco hustý index ukazuje na první položku se zadaným klíčem.

Poznámky

  1. Vytváření indexovaných pohledů na MS SQL Server . Získáno 10. srpna 2010. Archivováno z originálu 3. prosince 2010.
  2. Použití indexu pro výrazy v ORDER BY (PostgreSQL) . Získáno 18. srpna 2011. Archivováno z originálu dne 27. září 2011.
  3. Struktury haldy v MS SQL Server . Získáno 10. srpna 2010. Archivováno z originálu dne 24. března 2011.
  4. Hector Garcia-Molina, Jeffrey D. Ullman, Jennifer D. Widom. Databázové systémy: Kompletní kniha . - 2. vyd. - Prentice Hall , 2008. - 1248 s. — ISBN 978-0131873254 .