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

Výkon MySQL:Indexy MySQL/MariaDB

Data v databázi MySQL/MariaDB jsou uložena v tabulkách. Jednoduchý způsob uvažování o indexech je představit si rozsáhlou tabulku. Tento typ systému není vždy vhodný pro rychlé vyhledávání; tam se index stává nezbytným. Pokud neexistuje žádný index, musí databázový stroj začít na prvním řádku a procházet všechny řádky a hledat odpovídající hodnoty. Pokud se jedná o malou tabulku, pak to není velký problém, ale ve větších tabulkách a aplikacích, kde mohou být tabulky s miliony a dokonce miliardami řádků, to začíná být problematické. Jak si dokážete představit, prohledávání těchto řádků jeden po druhém bude časově náročné, a to i na nejnovějším hardwaru. Řešením je vytvořit INDEX (nebo více než jeden) pro vaše data.

Co je index?

Index je organizovaná vyhledávací tabulka, která obsahuje ukazatele, kde lze v databázi načíst data. Tento koncept je podobný knižním rejstříkům. V knize jsou v rejstříku uvedena čísla stránek, na kterých se nacházejí různá témata. V databázi index ukládá ukazatele, které jsou v logickém a seřazeném pořadí, což umožňuje rychlé vyhledávání v databázi. Představte si knihu bez rejstříku. Chcete-li vyhledat informace o konkrétním tématu, musíte začít od začátku a listovat stránkami, dokud nenajdete informace, které hledáte. Knižní rejstřík to řeší tím, že vám přesně řekne, na kterých stránkách jsou informace, které hledáte. Takto v podstatě funguje index MySQL.

Kdy MySQL používá indexy?

Kdykoli bude muset databázový server vyhledat informace, použije index k urychlení procesu. Příklady tohoto zahrnují klauzule WHERE, JOIN ON, MIN/MAX a ORDER BY/GROUP BY. Pokud budou vaše dotazy v některé z těchto situací často vyhledávat nebo odpovídat sloupci, měli byste zvážit vytvoření indexu.

Zlepšují indexy výkon databáze?

Ve většině případů je krátká odpověď ano. Pro čtení a prohledávání dat indexy absolutně zvyšují výkon. Neprovádění úplného prohledávání tabulky zlepší téměř jakýkoli dotaz SELECT. To přichází za malou cenu. U sloupců, se kterými se často manipuluje, jsou náklady na každou změnu. To může zablokovat INSERT a UPDATE v databázi.

Běžné typy indexů MySQL

Existují tři běžné typy indexů MySQL:

  • Primární klíč
  • Index
  • Unikátní

PRIMÁRNÍ KLÍČ

Primární klíč sděluje databázovému serveru, který je nejdůležitější sloupec (sloupce) v tabulce. Obvykle se to používá pro sloupce auto_increment id. Pokud máte například tabulku obsahující informace o zaměstnancích, budete chtít primární klíč ve sloupci „ID_ZAMĚSTNANCE“. V jiných tabulkách, tj. platové tabulce, byste místo všech údajů zaměstnance jednoduše odkazovali na EMPLOYEE_ID.

INDEX

Standardní INDEX se používá k tomu, aby sdělil databázovému serveru, že jeden nebo více sloupců v tabulce se bude hodně prohledávat, a proto by na nich měl být vytvořen index. To lze vytvořit během vytváření tabulky, nebo pokud později zjistíte, že potřebujete index na sloupec, lze jej přidat.

JEDINEČNÉ

UNIQUE index je trochu odlišný v tom, že klade specifická omezení na to, co lze zapsat do tabulky. Pokud se pokusíte vložit řádek obsahující hodnotu, která je již zahrnuta v datech, INSERT způsobí chybu. To umožňuje rychlé vyhledávání a také určitou integritu dat.

Jak vytvořit index

Existuje několik způsobů, jak vytvořit index na sloupci. Index můžete nastavit při CREATE TABLE nebo později pomocí příkazů ALTER TABLE nebo CREATE INDEX.

Vytvoření indexu PRIMÁRNÍHO KLÍČE

Nejjednodušší způsob, jak vytvořit index PRIMARY KEY, je vytvořit to při vytváření tabulky. Pro tento tutoriál použijeme příklad tabulky zaměstnanců. Tabulka bude mít tři sloupce:ID, FIRSTNAME a LASTNAME. Vytvoření může vypadat nějak takto:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32)
);

Tento příkaz vytvoří tabulku bez indexu. Primární klíč můžeme přidat příkazem, jako je tento:

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT PRIMARY KEY (ID);

To říká MySQL, že máme primární klíč na ID sloupce.

Jednodušší způsob, jak toho dosáhnout, je při vytváření tabulky. Začneme znovu, znovu vytvoříme tabulku a přidáme primární klíč v jednom příkazu.

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID)
);

Tento jediný příkaz provádí stejné úkoly jako první dva výše uvedené příkazy. Primární klíč může obsahovat více než jeden sloupec, ale všechny sloupce musí být jedinečné. Primární klíč lze použít k identifikaci libovolného jednotlivého řádku v tabulce.

Vytvoření indexu pomocí CREATE INDEX

Pomocí výše uvedené příkladové tabulky si představte, že společnost má tisíce zaměstnanců a vy chcete mít možnost rychle vyhledat zaměstnance podle příjmení. S primárním klíčem může existovat pouze jeden záznam. Nemůžete mít více lidí, kteří mají stejné ID zaměstnance. U příjmení je docela běžné, že toto jméno sdílí více lidí. Opět existuje několik způsobů, jak to udělat. Pomocí výše uvedené tabulky:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID)
);

Ke sloupci LASTNAME můžeme přidat index takto:

CREATE INDEX idx1 ON EMPLOYEE (LASTNAME);

Vyhledávání podle LASTNAME bude nyní v této tabulce rychlejší. V tomto příkladu je „idx1“ název indexu. To nám v budoucnu usnadní odkazování na samotný index, pokud to budeme potřebovat.

Dalším způsobem, jak přidat index do tabulky, je příkaz ALTER TABLE. Abychom dosáhli toho, co jsme udělali s předchozím příkazem, spustili bychom následující příkaz:

ALTER TABLE EMPLOYEE ADD INDEX idx1 (LASTNAME);

Poslední způsob, jak přidat index, který by ušetřil nějaký čas, je provést to během CREATE TABLE. Pokud dopředu víte, že budete hledat nebo se připojovat ke konkrétnímu sloupci, můžete vytvořit úvodní tabulku s indexem, který tam již je:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID),
  INDEX idx1 (LASTNAME)
);

Všechny tři tyto příkazy vytvářejí stejný výsledek.

Vícesloupcové indexy

Index nemusí být pouze v jednom sloupci. Pokud chceme rychlejší vyhledávání v FIRSTNAME i LASTNAME, můžeme vytvořit index pro oba sloupce. Ve vytvoření tabulky by to vypadalo takto:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID),
  INDEX idx2 (LASTNAME,FIRSTNAME)
);

Pomocí příkazu CREATE INDEX:

CREATE INDEX idx2 ON EMPLOYEE (LASTNAME, FIRSTNAME);

A nakonec příkaz ALTER TABLE:

ALTER TABLE EMPLOYEE ADD INDEX idx2 (LASTNAME, FIRSTNAME);

Vytvoření UNIKÁTNÍHO INDEXU

Mohou nastat situace, kdy budete chtít vytvořit index pro sloupec a také vynutit, aby všechny položky v tomto sloupci byly jedinečné. Pokud jsme naši ukázkovou tabulku rozšířili tak, aby zahrnovala sloupec KANCELÁŘ (označující, kterou kancelář v budově mají), můžeme z toho udělat UNIKÁTNÍ index. Pojďme pracovat s touto tabulkou:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  OFFICE INT,
  PRIMARY KEY (ID)
);

Všimněte si, že nyní máme v tabulce uložené celé číslo, které označuje, jakou kancelář daná osoba zastává. To může odkazovat na jinou tabulku „KANCELÁŘE“, která bude obsahovat informace o různých kancelářích v budově.

Chcete-li vytvořit index na toto, zadali bychom následující příkaz:

CREATE UNIQUE INDEX idx3 ON EMPLOYEE (OFFICE);

K jejich vytvoření můžete použít podobné příkazy v příkazech CREATE TABLE a ALTER TABLE. Pokud jste se nyní pokusili spustit tyto dva vložky:

INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (1, 'JANE', 'JOHNSON', 1);

INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (2, 'JOHN', 'SMITH', 1);

Při druhém INSERT by se zobrazila chyba:

Duplicate entry '1' for key 'idx3'

Odebrání indexu

Může nastat chvíle, kdy již nebudete chtít index na sloupci. Možná jste si uvědomili, že neprohledáváte sloupec tak často a index zpomaluje vkládání a aktualizace. K tomu použijeme příkaz DROP INDEX. Naše tabulka byla vytvořena takto:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR,
  LASTNAME CHAR,
  PRIMARY KEY (ID),
  INDEX idx (LASTNAME,FIRSTNAME)
);

Pokud chceme odstranit index ze sloupců LASTNAME a FIRSTNAME, zadáme tento příkaz:

DROP INDEX IDX ON EMPLOYEE;

Závěr

Databázové indexy jsou základním nástrojem, který optimalizuje rychlost načítání dat v rámci struktury, která využívá výkon vyhledávání a čtení v tabulce. Vylepšení indexu je primárně řízeno cenou většího počtu zápisů a/nebo úložného prostoru, aby byla zachována optimální struktura dat indexu.

Databáze MySQL a MariaDB nabízejí mnoho dalších možností vyhledávání a čtení, včetně mnoha, které zde nebyly popsány. Mezi hlavní poznatky patří: 

  • Udělejte si čas na plánování stolů předem.
  • Pokud při vytváření tabulek neplánujete dopředu, vyhodnoťte sloupce, které jsou nejvíce prohledávány, a vytvořte pro ně index.

Podívejte se na to v akci!

Naše široká řada dedikovaných serverů poskytuje výkon, stabilitu a zabezpečení potřebné k hostování nejmenších databází pro rostoucí podniky až po vysoce dostupné klastrované servery nastavené pro největší korporace. Chcete vidět, jaká řešení můžeme nabídnout, abychom vyhověli vašim potřebám?

Zavolejte nám na číslo 800 580 4985 nebo si s námi otevřete chat nebo lístek a promluvte si s jedním z našich zkušených poradců pro řešení nebo zkušené hostitelské poradce a zjistěte, jak můžete tuto technologii využít již dnes!

Series Navigation<>

  1. Oracle 12.2.0.1 přichází v roce 2016

  2. Automatické zvýšení po smazání v MySQL

  3. Jak vytvořit slabý referenční kurzor PL/SQL v databázi Oracle

  4. Vyberte číslo řádku v postgresu