sql >> Databáze >  >> RDS >> Mysql

Úvod do SQL indexů

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.

  1. Z Player tabulka PlayedID sloupec jednoznačně identifikuje každý řádek dat. Vytvořte Player tabulka následovaná jedinečným indexem na PlayerId 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);
    
  2. Z League tabulka LeagueId sloupec jednoznačně identifikuje každý řádek dat. Vytvořte League tabulka následovaná jedinečným indexem na LeagueId 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);
    
  3. Z Membership tabulka, obě PlayedID a LeagueId sloupce jednoznačně identifikují každý řádek dat; což je složený primární klíč. Vytvořte Membership tabulka následovaná jedinečným složeným indexem na PlayedID a LeagueId 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.


  1. Přehled kompilace Just-in-Time (JIT) pro PostgreSQL

  2. Příkaz VALUES v MySQL

  3. Jakou verzi PostgreSQL používám?

  4. CHYBA PostgreSQL:funkce to_tsvector(znak různý, neznámý) neexistuje