Začínáme s MySQL 15. – Zámky a klíče

V dnešním díle vám ve stručnosti povím, k čemu jsou v MySQL dobré zámky a klíče a jakým způsobem si jimi můžete zpříjemnit práci.
Zámky

Dříve než vám ukáži použití zámků v praxi, měl bych alespoň ve stručnosti říci, k čemu vlastně slouží. Jak již název napovídá, slouží k uzamykání, konkrétně k uzamykání tabulek. Pro uzamykání tabulek můžeme mít hned několik důvodů:
  • Potřebujeme zálohovat, a proto nechceme, aby po tuto dobu mohl někdo upravovat tabulku.
  • Potřebujeme, aby určitý podproces měl výhradní právo (po určitý čas) měnit obsah tabulky.
... a další.

(Poznámka: Pod podprocesem si zjednodušeně představte požadavek na vykonání určitého dotazu. Podproces se automaticky ukončí, je-li dotaz vykonán.)

Pro uzamykání tabulek se MySQL využívá dvojice příkazů LOCK TABLES/UNLOCK TABLES. Tyto příkazy mají následující syntaxi:

LOCK TABLES název_tabulky [AS alias] {READ | [READ LOCAL] | [LOW_PRIORITY] WRITE} [, název tabulky {READ | [LOW_PRIORITY] WRITE} ...];
...
UNLOCK TABLES;

Předchozí syntaxe vypadá trochu chaoticky, ale jak brzo uvidíte, je velmi jednoduchá. Jak jste si již mnozí všimli, tabulku lze uzamknout ve dvou režimech – READ a WRITE. Když je tabulka uzamčena v režimu READ, mohou z ní všechny ostatní podprocesy pouze číst. Právo zápisu zůstane pouze tomu podprocesu, který tabulku uzamkl. Pokud tedy jiný podproces bude chtít zapisovat do stejné tabulky, bude tento požadavek zařazen do fronty, kde počká, dokud tabulka nebude znovu odemčena. Tolik stručně k režimu READ. Režim WRITE se chová podobně, jen s tím rozdílem, že ostatní podprocesy nesmějí z dané tabulky číst ani zapisovat. Ukázka užití příkazu LOCK TABLES s režimem WRITE může vypadat následovně:

LOCK TABLES uzivatele WRITE;

Nyní z dané tabulky nemůže nikdo číst ani do ní nemůže zapisovat – to vše do té doby, dokud tabulku znovu neodemknete.

UNLOCK TABLES;

Jistě uznáte, že kdybychom chtěli takto uzamknout více tabulek najednou, bylo by to trochu pracné. Proto místo neustálého vypisování LOCK TABLES .... postačí pro uzamknutí více tabulek následující příklad:

LOCK TABLES uzivatele WRITE, data READ;

Jak vidíte, vše je vcelku jednoduché. Navíc kromě režimů READ a WRITE existuje ještě možnost – mimo jiných – použít režim LOW_PRIORITY WRITE. Pomocí něho docílíme toho, že veškeré požadavky, které budou chtít z tabulky číst, budou mít vyšší prioritu než ty, které chtějí výhradní přístup. Tato možnost se mnohdy hodí.

K zámkům ještě jedna závěrečná poznámka. Pokud chcete tak trochu obejít výhradní přístup a chcete přečíst některý údaj z tabulky, pak využijte příkaz SELECT HIGH_PRIORITY. Ovšem využívejte jej pouze v nejnutnějších případech!

Klíče

Hned na začátek vysvětlím, k čemu klíče jsou. Představte si velkou tabulku s uživateli, jichž je řádově tisíce. V takovéto tabulce nyní chcete vyhledat záznam (uživatel), který odpovídá danému kritériu. Jak se za normálních okolností zachová MySQL při vyřizování tohoto požadavku? Jednoduše testuje jeden záznam po druhém a hledá záznamy, které vyhovují danému kritériu. Jistě vás mnohé napadá, že to musí být příliš pomalé. Ano, máte pravdu! A proto existují klíče (neboli indexy), které tuto činnost podstatným způsobem zrychlují.

Stručně řečeno, klíč je určité množství dat, které je uloženo v samostatném souboru a které zrychluje vyhledávání dat v tabulce. Výhody jsou tedy jasně patrné. Díky tzv. rejstříku, jenž se vytváří v tomto samostatném souboru, jsou výsledná data vyhledána daleko rychleji. Ovšem ne vždy! Jak jistě víte, všeho moc škodí. Klíče by se – až na výjimky (PRIMARY KEY...) – neměly vytvářet v malých tabulkách. Zde by to totiž bylo kontraproduktivní.

Vytvářet indexy můžete v MySQL hned několika způsoby. Buď hned při návrhu tabulky (např. PRIMARY KEY...) nebo některým z následujících způsobů:

ALTER TABLE název_tabulky ADD (KEY|INDEX) index (pole[..]);
ALTER TABLE název_tabulky ADD UNIGUE index (pole[..]);
ALTER TABLE název_tabulky ADD PRIMARY KEY index (pole[..]);

nebo ekvivalentně:

CREATE INDEX index ON název_tabulky (pole[..]);
CREATE UNIGUE INDEX [index] ON název_tabulky (pole[..]);
CREATE PRIMARY KEY ON název_tabulky (pole[..]);

Vytvoření klíče není nic složitého. Musíme si při tom pouze uvědomit pár věcí. Pokud například chceme vytvořit jednopoložkový klíč, musíme se ujistit, zda pole, na které chceme klíč nastavit, obsahuje jedinečné záznamy. Dále je důležité si uvědomit, jestli tento klíč má vůbec smysl. Není totiž potřeba vytvářet klíč na pole, podle kterého nebudeme vyhledávat, resp. nebudeme vyhledávat tak často. Nejčastěji využívaný klíč (index) je jednopoložkový:

ALTER TABLE uzivatele ADD KEY prij_idx (prijmeni);

či ekvivalentně

ALTER TABLE uzivatele ADD INDEX

Pokud chcete zjistit seznam klíčů, které obsahuje konkrétní tabulka, provedete to následujícím způsobem:

SHOW KEYS FROM název_tabulky;

nebo

SHOW INDEX FROM název_tabulky;

Po nějakém čase se můžete rozhodnout, že klíč zrušíte:

ALTER TABLE název_tabulky DROP název_indexu;

nebo

ALTER TABLE název_tabulky DROP INDEX název_indexu;

Trochu jiná situace nastává u vícepoložkových klíčů. Pokud totiž nemůžete zajistit jednoznačnost záznamu v daném poli (např. 3x Novák), pak přicházejí na řadu vícepoložkové klíče. Vícepoložkový klíč může vypadat následovně:

ALTER TABLE uzivatele ADD KEY prij_idx (prijmeni, jmeno);

Předcházející příklad je typickým dvoupoložkovým klíčem, kterým zaručíme jedinečnost každého záznamu za předpokladu, že neexistuje např. 2x Novák Petr. Vícepoložkové klíče byste však měli používat pouze v nejnutnějších případech, protože zatěžují databázi mnohem více než klíče jednopoložkové.

Další skupinou klíčů jsou částečné klíče. Ty slouží k vytváření klíčů podle několika úvodních znaků z pole. Tato pole jsou nejčastěji typu CHAR či VARCHAR. Takovýto klíč může mít následující podobu:

ALTER TABLE uzivatele ADD KEY prij_idx (prijmeni(3));

Tento částečný klíč bude indexovat první tři znaky pole prijmeni. Podobným způsobem můžete vytvářet vícepoložkové částečné klíče neboli složené částečné klíče.

ALTER TABLE uzivatele ADD KEY prij_idx (prijmeni(3), jmeno(3));

Kromě jednopoložkových, vícepoložkových... klíčů existují v MySQL i jedinečné klíče. Jak již vyplývá z názvu, tyto klíče zajistí, aby se v indexovaných polích nenacházely duplicitní záznamy. Jedinečný klíč přidáte následujícím způsobem:

ALTER TABLE uzivatele ADD UNIQUE prij_idx (prijmeni);

Obdobnou funkci jako jedinečný klíč má primární klíč. Rovněž nesmí obsahovat duplicitní hodnoty, ale na rozdíl od jedinečného klíče smí být v tabulce obsažen maximálně jednou. Většinou vytváříme PRIMARY KEY přímo při návrhu tabulky, ale lze jej přidat i dodatečně:

ALTER TABLE název_tabulky ADD PRIMARY KEY (pole);

Primární klíč může být také vícepoložkový, i když se s tím setkáte zřídka:

ALTER TABLE název_tabulky ADD PRIMARY KEY (pole1, pole2);

nebo můžeme vytvořit částečně složený primární klíč:

ALTER TABLE název_tabulky ADD PRIMARY KEY (pole1(3), pole2(3));

Jak jste viděli z předcházejících příkladů, množství klíčů je velké, a stejně tak mnoho je možností jejich použití. Možnosti použití klíčů v MySQL jsou vskutku bohaté a samo o sobě je to na dlouhé povídání. Pokud vás tato problematika zajímá blíže, doporučuji nahlédnout do manuálu.

To by bylo pro dnešek vše. Příště vám povím něco málo o zabezpečení databáze.

Diskuze (14) Další článek: Adobe Acrobat i Reader 5.05

Témata článku: Software, Programování, MySQL, Úvodní znak, Výhradní právo, Pole, Klíč, Novák, Index, Syntax, Drop, Alter, Chci, Read, Primární data


Určitě si přečtěte

Google dosáhl revolučního milníku v kvantové nadvládě. IBM ale nesouhlasí

Google dosáhl revolučního milníku v kvantové nadvládě. IBM ale nesouhlasí

** Google představil nový kvantový čip s 53 qubity ** Oznámil, že díky němu lidstvo poprvé dosáhlo kvantové nadvlády ** IBM toto tvrzení zlehčuje

Karel Javůrek | 15

Nové iPhony, hodinky a další novinky Applu: Zase bude za co utrácet

Nové iPhony, hodinky a další novinky Applu: Zase bude za co utrácet

Dnes proběhla další velká prezentační akce Applu, na které došlo k odhalení nových iPhonů a dalších novinek. Událost jsme sledovali online, a tak se můžete podívat na chronologický zápis těch nejdůležitějších informací.

David Polesný | 136

Antivir zdarma: 8 bezplatných řešení, která zatočí s havětí v počítači

Antivir zdarma: 8 bezplatných řešení, která zatočí s havětí v počítači

** Součástí Windows 10 je integrovaný antivirový program. Stačí to? ** Představíme vám sedm aplikací na boj proti virům a malwaru ** Všechny jsou k dispozici zdarma a některé ani nemusíte instalovat

Karel Kilián | 30


Aktuální číslo časopisu Computer

Megatest 20 procesorů

Srovnání 15 True Wireless sluchátek

Vyplatí se tisknout fotografie doma?

Vybíráme nejlepší základní desky