Rozsáhlá kniha je skvělým pomocníkem databázového specialisty, vývojáře nejen webové aplikace a serverového administrátora (často v jedné osobě). Čtenář vývojář se naučí navrhovat DB schémata s ohledem na optimální dotazy – a nejen to.
Rozsáhlý text o MySQL 5.0
Kniha o 712 stranách je rozdělena do 13 kapitol se čtyřmi přílohami s místy nezvyklým, ale celkově logickým postupem v probíraných oblastech problematiky optimalizace databáze MySQL. Kniha čtenáře nešetří, co se předchozích znalostí nejen o databázích týče, a není tedy určena úplným začátečníkům. Je psána pro verzi MySQL 5.0. Klade ovšem důraz na obecné zásady optimalizace a budoucnost MySQL a není tedy problém tyto znalosti využít i pro novější verze MySQL.
Představení MySQL
První kapitola popisuje architekturu databázového stroje MySQL a seznamuje čtenáře s paralelním zpracováním dotazů (tedy dříve, než se k nějakým vůbec dostane), transakcemi a ACID funkcionalitou, úrovněmi izolace transakcí, popisu ukládání záznamů s více verzemi (MVCC) a zámků.
Následuje představení jednotlivých úložišť MySQL: MyISAM, InnoDB, Archive, CSV, Federated, Blackhole, NDBCluster, Falcon (originál knihy byl napsán v roce 2008, tedy ještě před koupí Sunu Oraclem, dnes je vývoj úložiště Falcon zastaven), solidDB, PBXT, Maria (dnes vydaná jako samostatný databázový stroj MariaDB). Je připojeno samozřejmě i vysvětlení jejich odlišností a doporučení k výběru toho správného pro danou oblast ukládání a zpracování dat.
Testování výkonu
V této části autoři popisují metodiku testování výkonu databází a vysvětlují rozdíly mezi testy a profilací výkonu. Představují několik standardních testů včetně TPC (v této kapitole často nesprávně uváděné jako TCP, zde však nehrozí záměna se síťovým protokolem a myslím, že tuto drobnost můžeme českému vydavateli odpustit) a jejich problémů – například nestačí změřit pouze dobu trvání mnoha transakcí (a získat tak počet transakcí za jednotku času). Také je nutné měřit okamžitou dobu trvání dotazu v dané chvíli v závislosti na počtu a charakteru ostatních transakcí. Dále se věnuje testům výkonu souborového úložiště a jeho optimalizaci (typ systému souborů a nastavení).
Optimalizace schématu a dotazů
Další kapitola se věnuje správnému návrhu databázového schématu a společně s ním i indexů. Spolu s kapitolou o návrhu a optimalizaci dotazů tvoří zcela zásadní celek pro optimalizaci databáze z hlediska vývojáře aplikace a autoři na toto správně upozorňují již v počátku kapitoly.
Je vysvětlen klíčový výkonový dopad správného výběru datových typů, jejich velikostí a problematika použití hodnoty NULL. Následuje podrobný popis všech datových typů pro ukládání celých a reálných čísel, řetězců, binárních dat, výčtů, data a času a speciálních typů (včetně popisu způsobu ukládání dat a indexů nejpoužívanějšími úložišti MyISAM a InnoDB).
Velká, až odborná, pozornost je věnována indexům. Autoři popisují typy indexů B-TREE, HASH, R-TREE, FULLTEXT, a to včetně poměrně detailního popisu datových struktur (pro indexy typu b-tree a hash), algoritmů a názorných diagramů pro jednotlivé příklady uložených dat na úrovni prvních semestrů VŠ. To považuji za velké plus knihy, pro psaní dobrých dotazů je totiž znalost vnitřních procesů velmi potřebná. Nechybí popis použití jednotlivých typů indexů z hlediska funkcí porovnání a řazení. Mnoho je také věnováno psaní dotazů s ohledem využití indexu, a to do značných podrobností (včetně výsledků testu výkonnosti jednotlivých příkladů).
V kapitole o schématu nechybí popis normálních forem. Zde se autoři nevěnují popisu jednotlivých forem, ale rozebírají výkon dotazů v normalizovaném, denormalizovaném a „něco mezi“ schématu. Uvádějí několik příkladů tabulek sloužících pro dočasná data, agregovaná data a tabulky čítačů s ohledem na indexy.
Obsáhlejší kapitolu o psaní dotazů bych (asi nejen já) čekal ze začátku knihy. Je však na pravém místě, tedy po dobře navrženém schématu a vhodně zvolených indexech. Autoři nás v ní učí psát dotazy s ohledem na přístup k úložišti, upozorňují na jemné nuance optimalizátoru prováděcího plánu v MySQL a věci, které optimalizátor plánů v databázovém stroji udělat nemůže. Zde se názorně dozvídáme, jak v MySQL psát korelované dotazy, jak správně naložit s dotazem na počet záznamů, jak se ptát na (ne)existující záznamy a podobně.
Server a jeho nastavení
Jestliže se první polovina knihy týká především vývojáře aplikace, druhá je přínosná pro administrátora databázového serveru. Asi nejobtížnější nastavení samotného MySQL serveru z hlediska výkonu se týká přidělené paměti RAM. Je to komplikováno vnitřní architekturou, počtem současně připojených uživatelů a také možností použití různých úložišť. Pokud k tomu ještě přidáme paměť pro samotný operační systém, vzniká nám docela jemný hodinový stroj, s jehož optimálním nastavením nám kniha pomůže v šesté kapitole.
Mít data v paměti je sice pekelně rychlé, ovšem nestačí to, proto je třeba vybrat správné disky a architekturu diskového pole. Tento problém se řeší hned o kapitolu dále, společně s nastavením operačního systému a výběrem vhodných procesorů a celkového hardwaru. Nastavení operačního systému se týká prakticky výhradně systému GNU/Linux, není určena přesná distribuce, příkazy jsou obecné a týkají se buď nastavení jádra (síťování a nastavení swapu), nebo souborového systému. Volbě souborového systému je věnováno několik stránek a je diskutována vhodnost žurnálu a také nastavení systému souborů ext3 a obecně i ostatních. Krátký odstavec je věnován vláknům.
Replikace, vysoká dostupnost a zálohování
Replikace se používá k několika účelům. Jednak (a z hlediska výkonu primárně) pro rozložení zátěže výběrových dotazů na více serverů, dále pro zálohování dat bez dopadu na hlavní server a také pro vysokou dostupnost služby, kde by jeden DB server představoval kritické místo. Kapitola 8 nás provede nastavením replikace pro všechny tyto skupiny použití a vysvětlí, jak funguje řádková a příkazová replikace, k čemu jsou v této oblasti binární logy apod.
Databázový stroj máme optimalizován a jeho repliky na několika geologicky oddělených místech, ale to nejdůležitější zatím však stále chybí. Zálohování dat by mělo patřit k základům jakékoliv IT práce, a i když to přímo nepatří do sféry optimalizace pro vysoký výkon, je dobré to zmínit. V knize je popsáno několik strategií zálohování MySQL (zálohování binárních logů, zálohování repliky pro omezení zátěže hlavního serveru, zálohování pomocí LVM momentek s poznámkou o InnoDB) s přihlédnutí na dobu zálohování, zátěže jakou to představuje pro celý systém a síť a také dobu obnovy zálohovaných dat.
Až téměř na samotném konci se dočteme o uživatelských právech v MySQL a šifrování. Ačkoliv to opět přímo nepatří do kategorie výkonové optimalizace, jsou tyto „výlety jinam“ právě tím, co dělá tuto knihu tak skvělou. Dozvíme se tak o MySQL prakticky vše (tedy snad kromě jazyka SQL samotného, ale to už by bylo opravdu nad rámec). Ale zpět uživatelským právům.
Je popsáno jednak jejich vytváření a úprava, ale také vnitřní vyhodnocování v MySQL stroji a také doporučení k nastavení síťování na replikách (např. zajímavé vypnutí síťového přístupu na repliku, která tímto bude zcela nedosažitelná a představuje tak bezpečnou zálohu).
Kniha určená odborníkům
Kniha je skvělým pomocníkem databázového specialisty, vývojáře nejen webové aplikace a serverového administrátora (často v jedné osobě). Čtenář vývojář se naučí navrhovat DB schémata s ohledem na optimální dotazy, ovšem jsou předpokládány předchozí znalosti dotazovacího jazyka SQL. Dozví se o zákulisí těchto dotazů v podobě algoritmů a interních procesů v databázovém stroji. Čtenář administrátor pak v knize najde popis a doporučení jemného nastavení DB serveru, hardwaru a operačního systému, zálohování dat, replikací pro vysoký výkon i dostupnost včetně mnoha zajímavých postupů. Vysokou informační hodnotu místy kazí český překlad, nenarazil jsem však na výraznější faktické chyby – čtenář věci znalý pozná nesrovnalosti rychle, ostatní snad pochopí z kontextu.
Závěrem mi dovolte osobní poznámku. Při čtení knihy a psaní této recenze jsem přemýšlel, komu je tato kniha vlastně určena. Člověk, který se chce zajímat o algoritmy v databázovém stroji do takovýchto podrobností, si podle mého názoru nevybere MySQL, ale vyšší DB. Na druhou stranu možná i tato kniha pomůže začátečníkům navrhovat výkonné databáze.
Baron Schwartz, Peter Zaitsev, Vadim Tkachenko, Jeremy D. Zawodny, Arjen Lentz, Derek J. Balling: MySQL profesionálně – Optimalizace pro vysoký výkon. Zoner Press, 2009. 712 stran. ISBN 978-80-7413-035-9.
Pingback: Report o ztrátě dat aneb proč nemám rád MySQL | Heronovo