© 2013 All rights reserved.
4

MySQL: návrh databáze

Strávíte před programováním aplikace dlouhé hodiny návrhem databáze, nebo začnete psát program a databázi navrhujete za běhu? Správným návrhem databáze můžete ušetřit čas a problémy.

Pokud programujete aplikaci, která potřebuje využívat databázi, je návrh databáze stejně důležitý jako samotný návrh struktury programu. Samozřejmě tím nemyslím databáze o velikosti několika řádek, i když zde správný návrh databáze taky ušetří nějakou tu práci, ale o rozsáhlých databázích, obsahujících několik milionů záznamů.

mysql optimalizace

Je nutné si uvědomit, že po zaplnění velké databáze, je každý zásah do její struktury, či ještě hůře, zásah do dat v uložených tabulkách, velmi nepříjemný a určitě ne jednoduchý.

Než začnu programovat

Obvykle, než začnu programovat, vezmu si do ruky tužku a papír a kreslím si. Kreslím si tabulky, vazby mezi tabulkami, zvažuji jak budou probíhat dotazy, jak budou jednotlivé tabulky mezi sebou nutně komunikovat, vypisuji si dotazy, vypisuji si složitější dotazy, které budou nutně muset probíhat a snažím se tyto dotazy co možná nejvíce optimalizovat, stejně jako data v tabulce. Optimalizace dotazů na databázi je stejně důležitá jako správný návrh tabulky.

Při návrhu je nutné rozmýšlet jak strukturu tabulek, tak datové typy v tabulkách. Běžně předem známe přibližné hodnoty, které budou v jednotlivých sloupcích tabulek uloženy a tím pádem můžete jejich velikosti přizpůsobit.

Když ukládáme do sloupce jeden znak, je zbytečné volit typ VARCHAR o velikosti 255 znaků, když nám databáze nabízí například CHAR o velikosti 1 znaku.

Optimalizace dotazů

Po návrhu tabulek a celé struktury databáze je vhodné si vytvořit například na lokálním počítači ukázkovou databázi, včetně naplnění obsahu tabulek. Čím více dat do tabulek naplníte, tím lépe. Sám programátor si musí uvědomit, jak obsáhlé tabulky v praxi a při běžném používání budou.

Na takto vytvořené databázi můžete jednoduše vyzkoušet vytvořené dotazy z prvního kroku přípravy a můžete sledovat časy jejich vykonávání.

Já například používám jednu databázi, která v současné době obsahuje miliony záznamů o velikosti cca 20 Gb, díky správné optimalizaci a dobrému návrhu databáze je program schopný veškeré potřebné informace ze všech různých tabulek dostat během několika setin sekundy.

Kdy spouštím jaké dotazy

Samozřejmě nejdou všechny dotazy řešit jednoduše, a ve velkých aplikacích a rozsáhlých databázích se musí obvykle vyskytovat i složitější dotazy, které zaberou více času, než obvyklé dotazy.

Pokud takového dotazy moje aplikace obsahuje, snažím se o jejich spouštění co možná nejméně, aby zbytečně celou databázi nezatěžovali.

Většinou není třeba tyto dotazy spouštět neustále dokola, ale stačí jenom několikrát za den, a jejich výsledky je možné “kešovat”.

Tím pádem není problém dotazy spouštět v předem určené době, kdy není databáze tolik vytížená – ideálně v noci.

MySQL: OPTIMIZE TABLE

Některé databáze obsahují samy o sobě nástroje pro optimalizace tabulek.

Například databáze MySQL obsahuje nástroj OPTIMIZE TABLE, který umožní defragmentaci dat v tabulce.

Fragmentace dat je nevýhodou úložišť s proměnnou délkou řádek, a tento příkaz dokáže takto vytvořené tabulky optimalizovat a ušetřit tak například i místo, které tabulka zabírá.

MySQL: Analyze table

Příkaz analyze table se stará jak jinak než o analýzu tabulky, nebo tabulek.

Analýzu tabulek je dobré spouštět periodicky v zadaných intervalech, protože databáze výsledek tohoto příkazu využívá.

Závěrem

Každá databáze obsahuje spoustu nástrojů pro optimalizaci dat, nebo získání informací o stavu dat, v tabulkách. Všechny tyto nástroje jsou popsány v dokumentacích databází a určitě je vhodné je používat.

Není vhodné podceňovat návrh, i třeba jednoduché databáze, která se časem může rozrůst.

Comments (4)

Pěkný článek, je to pravda, taky si nejdřív velice pečlivě rozmýšlím databáze, ale bohužel jsem lajdák a tak se snažím ty "složitější příkazy" nějak obejít, protože když jsem se učil php, tak sekci: "Databáze – MySQL" jsem projel jen na očko :-D taky to tak vypadá :-D ale asi se budu muset doučit no :)

Milióny záznamů? I databáze o dvou tabulkách může obsahovat milión záznamů. Asi si chtěl říct databáze a velkém počtu tabulek – tam je důležitý návrh.

Určitě u větších projektů návrhem databáze začínám. Sic je mnoho grafických nástrojů, tady je opravdu tužka a papír nejlepší.
Sám jsem dříve jako tady PowerPetan SQL dotazy moc nevyužíval a zůstával jsem u jednoduchých výběrů a updatů. Dneska už si na straně databáze šetřím daleko více času, ale pořád to ještě není ono. Opravdu dobrá znalost SQL může ušetřit hodně – nejen času.

Samozrejme jsou na mysli rozsahle databaze se spoustou tabulek.

Este zi nedodal ze pri tabulka ch typu InnoDB nemusis pouzivat optimize table..
optimize table sa pouziva pri tabulkach typu MyISAM.

Add comment

About
Hi, i am programmer from the Czech Republic. I love web development (Ruby, Ruby on Rails, PHP, Nette) and iOS development (Objective-C, Cocoa).
To cooperate, here is my phone:
+420 608 836