Návrh štruktúry databázy
Základom optimalizovaných dopytov je už samotný návrh databázy. Ten by mal ideálne spĺňať aspoň 3 normálne formy. Bližšie k normám pozri. cs.wikipedia.org , alebo tiež užitočné manualy.net .
Pri správnom použití týchto normálnych foriem získate správne navrhnuté tabuľky so správne umiestnenými kľúčmi. Tie sú doslova kľúčové pre správne dopyty.
Typy tabuliek v MySQL
V MySQL databáze máte pri tvorbe tabuliek na výber hneď niekoľko typov. Dve najvyužívanejšie voľby sú MyISAM a InnoDB. Základným rozdielom medzi týmito typmi je tzv transaction-safe engine. Jedná sa o množinu vlastností InnoDB tabuľky, ktorá zabezpečuje správnu konzistenciu dát pri jednotlivých transakciách.
Ponúka používateľské voľby commit a rollback, ktoré užívateľovi umožnia potvrdenie dopytu - commit, prípadne jeho "odrolovanie" - (vrátenie dát do stavu pred dopytom) - rollback. MyISAM transaction-safe engine nepodporuje a necháva riadenie a konzistenciu dát na užívateľovi. Je však o poznanie rýchlejšie a preto vhodné do internetových prezentácií, kde si programátor aplikačne zabezpečí správnosť údajov sám. Viac o InnoDB a jej transaction-safe engine nájdete po anglicky tu . < / p>
Použitie indexov a zaobchádzanie s EXPLAIN
Ďalším krokom k urýchleniu dopytov je použitie indexov. Indexy sú dátové štruktúry, ktoré umožňujú rýchle vyhľadávanie označených (zaindexovaných) záznamov. Bližšie k indexom sa môžete dočítať v seriáli na linuxsoft.cz
S voľbou správneho umiestnenia indexov vám môže pomôcť okrem iných aj MySQL príkaz EXPLAIN. Najprv si zformulujeme dopyt, ktorý chceme analyzovať a potom pred neho jednoducho dopíšeme EXPLAIN.
V PHPMyAdmine vyzerá analýza dotazu nasledovne:
Ako je vidieť, tento príkaz vracia veľa užitočných výsledkov: každý riadok predstavuje 1 tabuľku z dotazu (časť FROM). U každej je stĺpec possible_keys, ktorý vyjadruje návrh stĺpcov pre použitie indexov. Ďalší stĺpec key predstavuje výpis stĺpcov, kde sú indexy skutočne umiestnené. Ďalšou významnou informáciou je stĺpec rows. Číslo uvedené v tomto stĺpci predstavuje množstvo riadkov, ktoré MySQL musí prejsť pri spustení dopytu u každej tabuľky. Presný popis výstupov príkazu EXPLAIN nájdete v dokumentácii MYSQL
Obmedzenie množstva výsledkov - LIMIT
Užitočnou voľbou dopytov je aj obmedzenie množstva výsledkov pomocou klauzuly LIMIT. Použitie je vidieť na príklade vyššie. LIMIT prijíma 1 alebo 2 nezáporné parametre. Pri použití 1 parametra definované číslo vyjadruje maximálny počet vrátených riadkov od začiatku tabuľky. Pri použití 2 parametrov udáva prvé číslo posun od prvého riadku a druhé je maximálny počet vrátených riadkov. Výhodné použitie tejto voľby nájdeme predovšetkým pri listovaní stránkami s výsledkami / záznamami.
Veľkosti tabuliek
Pri správe databázy by sme mali dbať na veľkosť tabuliek - množstvo dát v nich. Je viac než jasné, že práve počet záznamov je rozhodujúci pre rýchlosť kladeného dopytu. V praktickom použití sa ponúka napríklad rozdelenie dát do viacerých tabuliek. Napr. chceme logovať prístupy ľudí do aplikácie. Ak potrebujeme uchovávať logy niekoľko rokov spätne môžeme pre každý rok vytvoriť vlastnú tabuľku a klásť otázky len na konkrétnu tabuľku.
Hoci sa toto môže zdať v rozpore s normálnymi formami, tak sa nájdu v praxi podobné, ak nie užitočnejšie príklady využitia pre optimalizáciu dotazov.
Údržba tabuliek
Najmä u InnoDB tabuliek existuje možnosť zavolania jednoduchého príkazu: ALTER TABLE název_tabulky;
Tento na prvý pohľad nepodstatný dopyt MYSQL server interne spracuje tak, že danú tabuľku uzamkne pre zápis a reoptimalizuje vyhľadávanie. Dopuručujeme využívať najmä u veľkých tabuliek napríklad v nočných hodinách (rozumej v dobe, kedy nie je potrebné do tabuľky zapisovať).