MySQL

Screenshot příkazové řádky MySQL
Vývojář Oracle Corporation
Aktuální verze 5.6.16 (31. leden 2014)
Připravovaná verze 5.7.3 (3. prosinec 2013)
Operační systém Windows, Linux, Solaris, OS X, FreeBSD
Vyvíjeno v C, C++
Typ softwaru Relační databáze
Licence GPL nebo komerční
Lokalizace anglicky
Web www.mysql.com
MySQL je databázový systém, vytvořený švédskou firmou MySQL AB, nyní vlastněný společností Sun Microsystems, dceřinou společností Oracle Corporation. Jeho hlavními autory jsou Michael „Monty“ Widenius a David Axmark. Je považován za úspěšného průkopníka dvojího licencování – je k dispozici jak pod bezplatnou licencí GPL, tak pod komerční placenou licencí.

MySQL je multiplatformní databáze. Komunikace s ní probíhá – jak už název napovídá – pomocí jazyka SQL. Podobně jako u ostatních SQL databází se jedná o dialekt tohoto jazyka s některými rozšířeními.

Pro svou snadnou implementovatelnost (lze jej instalovat na Linux, MS Windows, ale i další operační systémy), výkon a především díky tomu, že se jedná o volně šiřitelný software, má vysoký podíl na v současné době používaných databázích. Velmi oblíbená a často nasazovaná je kombinace Linux, MySQL, PHP a Apache jako základní software webového serveru („technologie LAMP“).

MySQL bylo od počátku optimalizováno především na rychlost, a to i za cenu některých zjednodušení: má jen jednoduché způsoby zálohování, a až donedávna nepodporovalo pohledy, triggery, a uložené procedury. Tyto vlastnosti jsou doplňovány teprve v posledních letech, kdy začaly nejčastějším uživatelům produktu – programátorům webových stránek – již poněkud scházet.

Architektura MySQL serveru

Architektura MySQL serveru
Architektura MySQL se velmi odlišuje od architektur jiných databázových serverů, má široký záběr a je užitečná pro řešení mnoha různorodých úloh. Vrstva, která je úplně nahoře, obsahuje služby, jež nejsou jedinečné pro MySQL. Obsluhují většinu potřebných nástrojů klient/server, které jsou založeny na síti.

Ve druhé vrstvě se nachází valná část mozku MySQL, včetně kódu pro rozbor (parsing), analýzu, optimalizaci a pro všechny zabudované funkce. Na této úrovni se nachází veškerá funkcionalita, která se poskytuje prostřednictvím úložných enginů.

Třetí vrstva obsahuje úložné enginy. Ty mají na starosti ukládání a získávání všech dat uložených v MySQL. Server komunikuje s úložnými enginy prostřednictvím API úložných enginů. Toto rozhraní skrývá rozdíly mezi jednotlivými úložnými enginy a činí je na vrstvě dotazů velmi transparentními. API obsahuje několik desítek nízkoúrovňových funkcí, které provádějí operace jako "zahájit transakci" nebo "získat řádek, který má tento primární klíč". Úložné enginy nedělají rozbor SQL a nekomunikují mezi sebou - jednoduše pouze odpovídají na požadavky serveru.

Správa připojení a bezpečnost
Každé klientské připojení dostane uvnitř serverového procesu vlastní vlákno (thread). Dotazy tohoto připojení se vykonávají uvnitř tohoto jediného vlákna, které zase sídlí na jednom jádru nebo CPU. Protože server udržuje vlákna v cache, nemusejí se vytvářet a likvidovat pro každé nové připojení. Autentizace je založena na uživatelském jménu, hostiteli, odkud pocházejí a heslu. Dají se také používat certifikáty X509 přes připojení SSL. Jakmile se klient připojí, server pro každý dotaz vydaný klientem ověřuje, zdali má patřičná oprávnění pro akci, kterou chce vykonat.

Optimalizace a vykonávání
MySQL provádí rozbor dotazů proto, aby vytvořil interní stromovou strukturu (parse tree), pak aplikuje všelijaké optimalizace. Může dotaz přepsat, určit pořadí, v němž bude číst tabulky, zvolit, které indexy použije atd. Prostřednictvím speciálních klíčových slov může programátor optimalizátoru předat tzv. pokyny (hints), jimiž se dá ovlivnit rozhodovací proces. Optimalizátor se ve skutečnosti nestará o to, který úložný engine používá konkrétní tabulka. Úložný engine ovšem ovlivňuje, jak server optimalizuje dotaz. Optimalizátor od úložného enginu zjišťuje, zdali má jistou výbavu, ptá se na náklady jistých operací a dotazuje se na statistiky o datech tabulky.

Ovšem ještě dřív než server začne s rozborem dotazu, obrátí se na cache dotazů (query cache), kam může ukládat pouze příkazy SELECT společně s jejich výslednými sadami. Jestliže někdo vydá dotaz, který je identický s nějakým dotazem, který je už k dispozici v cache, server nemusí dělat vůbec žádný rozbor, nemusí nic optimalizovat a dokonce nemusí dotaz ani vykonat - jednoduše pouze předá zpět uloženou výslednou sadu.

Úložné enginy (úložiště dat)
MySQL ukládá každou databázi (také se jim říká schéma) do podadresáře svého datového adresáře na odkladovém souborovém systému (dá se změnit klauzulí DATA DIRECTORY a INDEX DIRECTORY). Když vytvoříte nějakou tabulku, MySQL ukládá definici tabulky, data tabulky a indexy tabulky do speciálních souborů s následujícími příponami:

.frm – definice tabulky
.MYD – data tabulky
.MYI – index/y tabulky
Název souboru bez přípony se shoduje s názvem tabulky. Jelikož MySQL používá při ukládání definic souborový systém, otázka rozlišování velikosti písmen je závislá na platformě. Na instalaci MySQL na Windows se velikost písmen v názvech tabulek a databází nerozlišuje, na unixových systémech se velikost písmen rozlišuje. Každý úložný engine ukládá tabulky a indexy jinak, definici tabulky ovšem zpracovává samotný server.

MySQL nabízí několik typů úložných enginů (storage engine), které se liší svými možnostmi, použitím a způsobem ukládání dat do souborů:

ARCHIVE – engine uzpůsobený pro ukládání velkého množství neindexovaných dat.
BLACKHOLE – engine, který data přijímá, ale neukládá je (zahazuje je).
CSV – ukládá data v textovém formátu CSV.
EXAMPLE – nefunkční engine, který slouží jako ilustrační pro potřeby zdrojových kódů databáze MySQL a využijí ho tedy jen její vývojáři.
FEDERATED
InnoDB
MEMORY nebo HEAP – vysoce výkonný engine, který data uchovává pouze v operační paměti, při restartu serveru jsou data ztracena.
MERGE - sloučení dat z několika MyISAM tabulek o stejné struktuře, starší alternativa k partition.
MyISAM
Před koupí MySQL Oraclem byl vyvíjen ještě engine Falcon, ale Oracle jeho vývoj ukončil.

Úložné enginy fungují jako moduly, které lze k distribuci tohoto databázového systému doinstalovat; jejich aktuální seznam lze zjistit příkazem SHOW ENGINES.

Přehled podporovaných vlastností
verze 3.23
cizí klíče (podporovány v tabulkách typu InnoDB)
transakce (podporovány v tabulkách typu InnoDB)
Příkazová replikace
verze 4.0
sjednocování dotazů pomocí UNION
verze 4.1
podpora různých znakových sad a porovnávání na úrovni databáze, tabulky i sloupce
podpora časových pásem v datech
poddotazy
R-stromy (v tabulkách typu MyISAM)
podpora „audio“ funkce SOUNDS_LIKE
verze 5.0
uložené procedury
triggery
pohledy
práce s metadaty
distribuované XA transakce (v tabulkách typu InnoDB)
kurzory
INFORMATION.SCHEMA
verze 5.1
partitioning
časování událostí (Event Scheduler)
úložiště IBMDB2I (tabulky typu IBM DB2, podporující transakce)
rozšiřitelné API
replikace na úrovni řádků
logování na straně serveru
plánováno ve verzi 6
cizí klíče (i pro jiné tabulky než InnoDB)
použití cizích i fulltextových klíčů současně
Kódování a znakové sady
Od verze 4.1 MySQL řeší ukládání řetězců s podporou Unicode pomocí nastavení znakové sady (CHARACTER SET) COLLATION. To představuje souhrn způsobů, jak k takto uloženému textu přistupovat – porovnávání (s ohledem na případné národnostní zvyklosti), řazení, citlivost velkých malých písmen, ligatur, transkripcí speciálních znaků apod. Znaková sada a collation mohou být nastaveny individuálně pro daný (textový) sloupec, mimo je možnost nastavit defaultní sadu a collation pro tabulku (tu zdědí vytvářené sloupce, u kterých nebyla explicitně vybrána), i celá databáze (tu zase kaskádově zdědí v ní vytvářené tabulky, pokud pro ně není výslovně nastavena). I jednotlivé collations jsou modulární (existují v podobě textových souborů). Jejich aktuální výčet lze zjistit příkazem SHOW COLLATION.