Hlavní navigace

MySQL na konci léta

26. 9. 2002
Doba čtení: 5 minut

Sdílet

Databázový server MySQL je jedničkou na poli otevřených databázových systémů již řadu let. V poslední době však klepe na dveře nová verze 4.0, která přináší mnoho novinek. V nádledujících dvou článcích se podíváme na stávající vlastnosti MySQL, dále si něco povíme o transakčních tabulkách BDB a InnoDB a popíšeme si také, co bude ve čtverkové řadě nového.

MySQL je relační databázový server, který funguje na mnoha operačních systémech (zejména těch UNIXových). Mezi jeho hlavní přednosti patří jednoduchá instalace a obsluha, nízká cena (pokud program postavený na MySQL nebudete prodávat, je zdarma) a vysoký výkon. MySQL se snaží být kompatibilní se standardem ANSI SQL92, což se vývojářům prakticky daří. Některé vlastnosti ale vypouští, jiné zase přidává. K MySQL si samozřejmě můžete stáhnout klientská API pro mnoho jazyků (C/C++, Perl, Python, Java…) nebo ODBC ovladače.

Jak jsem již napsal, MySQL je relační databází. Je proto logické, že v ní můžeme vytvářet tabulky, přidávat záznamy či data vybírat v souladu s normou SQL. Co se týče datových typů, zde nabízí MySQL široké spektrum možností – od jednoduchých číselných a datumových až po boolean, text či blob. Naproti tomu MySQL nenabízí taková rozšíření, jako jsou vnořené selecty (SELECT … FROM SELECT …), uložené procedury a triggery (umožňuje ale vytvořet vlastní funkce např. pro agregaci atp.), cizí klíče (server sice SQL příkazy FOREIGN KEY spolkne kvůli kompatibilitě SQL skriptů, ale cizí klíče nevytváří) a také pohledy (views).

Nadruhou stranu má MySQL spoustu zajímavých rozšíření. Mezi zajímavé drobnosti bych zařadil podmíněné mazání tabulek (DROP TABLE IF EXISTS tabulka), RENAME TABLE, regulární výrazy nebo funkci LAST_INSERT_ID(). MySQL také nabízí dvě zajímavá rozšíření, která stojí za to hlouběji prozkoumat. Je to možnost replikace a fulltextového indexování. Pomocí replikace můžete snadno vytvářet „otroky“ (slaves), servery, jenž budou připojeni na centrální (master) server a budou si obnovovat všechny změny. Díky tomu můžete například distribuovat zátěž na více databázových strojů. Replikace se v MySQL snadno konfiguruje (musíte aktivovat tzv. binární logy) a dá se výhodně využít také pro záložní účely. Nakonec bych ještě rád poznamenal, že replikace je v MySQL pouze jednosměrná.

Druhou zajímavou vlastností MySQL serveru je fulltextový index. Nad poli VARCHAR a TEXT je možno vytvořit fulltextový index, který umožňuje vyhledávání přímo příkazem SELECT … MATCH … AGAINST. Příkaz je schopen vrátit jakýsi index shody pro každý záznam. Aplikace si může výsledek setřídit podle tohoto indexu a zobrazit příslušné záznamy nebo provádět jiné zajímavé věci. Ačkoli je fulltextový index poměrně novou věcí, funguje dobře i s češtinou. Zatím ale neumožňuje jemné nastavování jako například stopwords (zakompilováno), minimální délka slova (zakompilována na 4) atd. Mnoho se toho v této oblasti připravuje, nicméně fulltextový index je již dnes velikým pomocníkem. Implementace vlastního fulltextového vyhledávání s podporou více slov není zase jednoduchou záležitostí (u více slov jsou na MySQL problémy s formulací dotazu a povolávají se dočasné tabulky). Může vám tedy ušetřit mnoho práce.

MySQL nabízí několik druhů tabulek. Jsou to standardní netransakční typy (MyISAM, ISAM, MERGE, HEAP) a transakční typy (BDB, InnoDB). Výhodou netransakčních typů tabulek je jejich vyšší výkon. U kritických aplikací (účetnictví, bankovnictví…) má bezpečnost a spolehlivost přednost před výkonem a právě zde se používají transakční tabulky. Pomocí SQL příkazů BEGIN/COMMIT/ROL­LBACK můžete bezpečně měnit data v tabulkách tak, aniž by se porušila integrita dat. Při výpadku je server schopen nastartovat tak, aby byla tato integrita zajištěna. Rád bych poznamenal, že to, že použijete transakční tabulky, vám samo o sobě na bezpečnosti nepřidá. Musíte efektivně využívat BEGIN/COMMIT/ROL­LBACK ve své aplikaci. Aby vaše snažení mělo smysl, doporučuji vypnout autocommit (např. příkazem SET AUTOCOMMIT=0 nebo v konfiguračním souboru). Jinak by totiž server prováděl všechny změny ihned, což by nebylo žádoucí.

Základní (default) tabulkou, která se vytvoří, když nespecifikujete explicitně jinou, je typ MyISAM. Tento typ tabulky je rozšířením a praktickým nahrazením staršího typu ISAM. Data jsou organizována na disku ve formě souborů (*.MYD pro data, *.MYI pro indexy a *.frm pro deskriptory). Co je zajímavé, je to, že binární data v nich jsou nezávislá na platformě. Migrace databáze ze systému na systém probíhá prakticky obyčejným kopírováním souborů, což je veliká výhoda. Tyto soubory obvykle naleznete v adresáři /var/lib/mysql. MyISAM podporuje tři typy organizování dat: statické, dynamické a komprimované. Toto organizování se týká polí s proměnlivou délkou (VARCHAR, TEXT, BLOB). U statického orgranizování dat bude MySQL rezervovat v souborech místo pro záznamy staticky (tj. všechny mají největší možnou délku) nebo dynamicky (délka záznamů je proměnlivá). Výhody jsou zřejmé. U statického organizování je přístup rychlý a data se po havárii snadno obnoví. Na druhou stranu se plýtvá místem na disku. U dynamického organizování je menší spotřeba místa na disku (pokud tedy používáte v databázi záznamy s proměnlivou délkou samozřejmě), ale pomalejší přístup. Zcela odlišné je komprimované orgranizování. Tyto tabulky můžete vytvořit pouze externí řádkovou utilitou, jsou pouze pro čtení a jsou rafinovaně komprimovány, což je výhodné pro různé prezentace na CD-ROMech apod.

Druhým typem tabulky je HEAP. Jedná se o tabulky uložené pouze v paměti (pozor!), a jsou proto velmi vhodné pro vytváření dočasných (TEMPORARY) tabulek, pomocí kterých se dají obejít některá omezení, která MySQL server má (např. vnořené selekty). Tento typ tabulky využívá velmi rychlých hashovacích algoritmů pro indexy, ovšem má některá omezení (nemůžete vytvořit TEXT/BLOB pole, neumožňuje AUTO_INCREMENT nebo vytvořit jiný index než hashovací – např. FULLTEXT nebo B-TREE a tak dále). Tato omezení přímo vyzývají k tomu, aby se HEAP tabulky používaly pro odkládání mezivýsledků či ke spojování složitých dotazů. Díky tomu aplikace vyladěné pro MySQL vykazují velice zajímavé výkony, které se dají srovnávat s prvoligovými komerčními servery.

root_podpora

Posledním typem netransakčního typu tabulky je typ MERGE, který má však významné omezení. Nemůžete vkládat nová data (vybírat či mazat však ano). Tento typ je rozšířením MyISAM tabulek. Umožňuje rozdělit data a indexy do více než jednoho souboru. Díky tomu můžete tabulku distribuovat na více disků (případně počítačů, chcete-li), což je vlastnost velice zajímavá zejména pro některé databáze určené pouze pro čtení. Můžete tak výrazně zvýšit výkon své aplikace.

Příště se podíváme na transakční tabulky. Nakonec se dozvíte, co bude nového v nové verzi 4.0.

Byl pro vás článek přínosný?