V relačních databázových systémech index databáze je extrémně výkonný nástroj pro získávání dat. V této příručce se dozvíte o jedinečných indexech, primárních klíčích a složených primárních klíčích.
Co je index databáze?
Index databáze je objekt datové struktury spojený s databázovou tabulkou. Používá se ke zvýšení rychlosti databázových dotazů (prostřednictvím SQL SELECT
příkaz). Obecně existují dobře definované metody pro rozhodování o typech indexů, které se mají vytvořit. To je do značné míry řízeno tím, jak spolu tabulky v databázi souvisí a jak se data načítají.
Proč používat indexy?
Obecně platí, že dotazy (nebo vyhledávání) v tabulce pomocí SQL SELECT
příkazy jsou sekvenční. Sekvenční vyhledávání vyžaduje začít v horní části tabulky a číst každý řádek dat, dokud nebudou požadovaná data načtena. To je extrémně neefektivní a může to být nákladná operace z hlediska rychlosti.
Indexy na druhé straně využívají k výpočtu hodnoty indexu hašovací funkci. Poskytuje přímý přístup k ovlivněnému řádku (klíči) v indexu. Jakmile je tento řádek (klíč) umístěn v indexu, má záznam indexu ukazatel přímo na řádek tabulky, který je vyžadován v dotazu. Tyto ukazatele jsou stanoveny během vytváření indexu a údržby indexu. Rychlost načítání dat při použití indexů se řádově zvyšuje.
Anatomie jedinečného databázového indexu
Databázová tabulka může mít jeden nebo více přidružených indexů. Samotné indexy obsahují hodnoty řádků (klíčů) z jednoho nebo více sloupců v tabulce. Má také ukazatel, který ukazuje na skutečné řádky tabulky obsahující tyto klíčové hodnoty. Počet řádků, na které ukazuje daný klíč v indexu, závisí na tom, zda je index unikátním indexem nebo nejedinečný index .
Jak název napovídá, jedinečný index obsahuje klíče, které ukazují pouze na jeden datový řádek v dané tabulce. Jedinečné indexy zajišťují, že každý řádek v tabulce obsahuje jedinečné hodnoty v definovaných sloupcích indexované tabulky. Ve skutečnosti žádné dva řádky nemohou mít v indexovaných sloupcích stejné hodnoty. Kromě toho se vytvářejí jedinečné indexy na sloupcích, které jsou označeny jako primární klíč pro stůl. Primární klíče jsou definovány jako jeden nebo více sloupců, které jednoznačně definují řádek v databázové tabulce.
Níže uvedené příklady ukazují, jak se v SQL používají primární klíče a jedinečné indexy. Všechny příklady používají tabulku s názvem Student
, v ukázkové databázi s názvem exampledb
. Chcete-li přidat ukázková data, použijte následující příkaz:
INSERT INTO Student(SSNumber, LastName, FirstName)
VALUES
(111111111, Smith, John),
(222222222, Jones, Mary),
(333333333, Hansen, Robert);
Zobrazení dat uložených v Student
tabulka:
SELECT * FROM Student;
Měli byste vidět následující výstup:
+-----------+----------+-----------+
| SSNumber | LastName | FirstName |
+-----------+----------+-----------+
| 111111111 | Smith | John |
| 222222222 | Jones | Mary |
| 333333333 | Hansen | Robert |
+-----------+----------+-----------+
Poznámka Pokud není uvedeno jinak, všechny příkazy v této příručce fungují dobře na obou MySQL a PostgreSQL databáze.
Primární klíč a index s jedním sloupcem
Předpokládejme například, že škola sleduje své studenty v tabulce s názvem Student
. Tato tabulka má přidružené sloupce s názvem Student
, SSNumber
, LastName
a FirstName
. Z těchto sloupců Student
je sloupec primárního klíče, protože jedinečně identifikuje každý řádek dat v Student
stůl. Vytvořte jedinečný index (SSIndex
) na SSNumber
pro usnadnění rychlého načítání dat z tabulky. K provedení tohoto dotazu se používá následující příkaz SQL DDL:
CREATE TABLE Student (SSNumber CHAR(9) NOT NULL,LastName VARCHAR(30) NOT NULL,FirstName VARCHAR(20) NOT NULL,PRIMARY KEY (SSNumber));
CREATE UNIQUE INDEX SSIndex ON Student (SSNumber);
Poznámka Oba výše uvedené příkazy SQL jsou odděleny středníkem (;), který je kompatibilní s většinou relačních databázových systémů. SSNumber
je specificky určen jako primární klíč tabulky.
SSIndex
obsahuje pouze informace, které jednoznačně identifikují data v každém řádku Student
stůl. Každý řádek SSIndex
má ukazatel na odpovídající řádek v Student
stůl. Tento SSIndex
index vám umožňuje vyhnout se sekvenčnímu vyhledávání dat v tabulce, což zlepšuje výkon minimalizací času potřebného pro dotaz.
Chcete-li najít související informace pro Robert Hansen
přes jejich SSNumber
, použijte příkaz SQL uvedený níže. Příkaz nejen eliminuje sekvenční vyhledávání Student
tabulka, ale také používá SSIndex
poskytnout přímý přístup k požadovanému datovému řádku. Je to díky použití hashovací funkce a souvisejícího ukazatele indexu.
SELECT * FROM Student WHERE SSNumber = 333333333;
Vrácená data by měla být následující:
+-----------+----------+-----------+
| SSNumber | LastName | FirstName |
+-----------+----------+-----------+
| 333333333 | Hansen | Robert |
+-----------+----------+-----------+
Vícesloupcové složený primární klíč a index
Příklady v této části používají tři tabulky, které ukládají data související s tenisovou ligou. Tyto tři stoly se jmenují Player
, League
a Membership
. Hráč může hrát ve více ligách a tabulka členství tuto asociaci poskytuje. Ke třem tabulkám jsou přidruženy následující sloupce:
Sloupce Player
tabulky jsou zobrazeny níže s PlayedID
jako primární klíč.
+----------+-----------+-----------+
| PlayedID | LastName | FirstName |
+----------+-----------+-----------+
Sloupce League
tabulky jsou zobrazeny níže s LeagueId
jako primární klíč.
+----------+------------+------------+
| LeagueId | LeagueName | SkillLevel |
+----------+------------+------------+
Sloupce Membership
tabulky jsou zobrazeny níže
+----------+-----------+
| PlayedID | LeagueId |
+----------+-----------+
Níže uvedené kroky ukazují, jak vytvořit Player
, League
a Membership
tabulky.
-
Z
Player
tabulkaPlayedID
sloupec jednoznačně identifikuje každý řádek dat. VytvořtePlayer
tabulka následovaná jedinečným indexem naPlayerId
sloupec.CREATE TABLE Player ( PlayedID INT NOT NULL, LastName VARCHAR(30) NOT NULL, FirstName VARCHAR(20) NOT NULL, PRIMARY KEY (PlayedID) ); CREATE UNIQUE INDEX PlayerIndex ON Player (PlayedID);
-
Z
League
tabulkaLeagueId
sloupec jednoznačně identifikuje každý řádek dat. VytvořteLeague
tabulka následovaná jedinečným indexem naLeagueId
sloupec. Následuje příkaz SQL k provedení této operace:CREATE TABLE League ( LeagueId INT NOT NULL, LeagueName VARCHAR(50) NOT NULL, SkilLevel VARCHAR(20) NOT NULL, PRIMARY KEY (LeagueId) ); CREATE UNIQUE INDEX LeagueIndex ON League (LeagueId);
-
Z
Membership
tabulka, oběPlayedID
aLeagueId
sloupce jednoznačně identifikují každý řádek dat; což je složený primární klíč. VytvořteMembership
tabulka následovaná jedinečným složeným indexem naPlayedID
aLeagueId
sloupce.CREATE TABLE Membership ( PlayerId INT NOT NULL, LeagueId INT NOT NULL, PRIMARY KEY(PlayerId, LeagueId) ); CREATE UNIQUE INDEX MembershipIndex ON Membership (PlayerId, LeagueId);
MembershipIndex
je index generovaný hashem, který se skládá ze složeného klíče (PlayedId
a LeagueId
). Má ukazatele na datové řádky, které představuje. Použití takového indexu usnadňuje rychlé získávání dat s přímým přístupem, na rozdíl od lineárního sekvenčního získávání dat. Chcete-li například určit všechny hráče spojené s „Mužskou čtyřhrou“ z několika záznamů v každé z výše uvedených tabulek, můžete zadat následující příkaz SQL:
SELECT Player.LastName, Player.Firstname
FROM Player, Membership
WHERE Membership.LeagueId = 2
AND Membership.PlayerId = Player.PlayerId
Jsou vrácena následující data:
+----------+-----------+
| LastName | FirstName |
+----------+-----------+
| Smith | John |
| Hansen | Robert |
+-----------+----------+
Bez použití MembershipIndex
a PlayerIndex
, výše uvedený dotaz by se prováděl výrazně pomaleji.
Nejedinečné indexy
Nejedinečný index obsahuje položky, které mohou ukazovat na jeden nebo více řádků pro libovolné dané hodnoty klíče. Chcete-li například vyhledávat podle jména osoby, je nutné vytvořit v tabulce nejedinečný složený index pro FirstName
a LastName
. Od kombinace FirstName
a LastName
nelze zaručit, že je jedinečný, výsledný index vytvořený v těchto dvou sloupcích efektivně generuje nejedinečný index.
Problém se snížením výkonu databáze pomocí indexů
I když indexy napomáhají rychlosti provádění dotazů, je třeba je aktualizovat při každé změně indexovaných sloupců nebo při přidání či odstranění řádků tabulky z databáze. To může mít negativní vliv na výkon databáze. Je důležité mít na paměti množství vkládání, mazání a úpravy požadovaných vašich indexů během používání transakční databáze. Zvažte, co je pro vás v databázové aplikaci důležité; rychlost provádění dotazu nebo rychlost manipulace s daty. Odpověď na tuto otázku spočívá v tom, jak se databázová aplikace používá, jak často to ovlivňuje návrh databáze a počet vytvořených indexů.
Závěr
Vytváření a používání databázových indexů generuje rychlé odpovědi na dotazy a eliminuje sekvenční vyhledávání řádků v tabulkách. Údržba indexu prostřednictvím manipulace s daty však může mít škodlivé dopady na výkon databáze. Návrháři databází si musí být vědomi kompromisů při používání databázových indexů a mít na paměti optimalizaci pro celkový výkon databáze.