Přístup k mysql přes php. Příklady SQL dotazů v MariaDB (MySQL). Místo NULL použijte NOT NULL

9. října 2008 ve 23:37

Optimalizace My SQL dotazy

  • MySQL

V denní práce Při psaní dotazů se musím potýkat s poměrně podobnými chybami.

V tomto článku bych rád uvedl příklady toho, jak NEPÍSAT dotazy.

  • Vyberte všechna pole
    SELECT * FROM tabulky

    Při psaní dotazů nepoužívejte výběr všech polí - "*". Uveďte pouze pole, která skutečně potřebujete. Tím se sníží množství načítaných a odesílaných dat. Nezapomeňte také na krycí indexy. I když skutečně potřebujete všechna pole v tabulce, je lepší je uvést. Za prvé, zlepšuje čitelnost kódu. Při použití hvězdičky není možné poznat, která pole jsou v tabulce, aniž byste se na ni podívali. Za druhé, časem se může změnit počet sloupců ve vaší tabulce a pokud je dnes pět INT sloupců, tak za měsíc mohou přibýt pole TEXT a BLOB, což zpomalí výběr.

  • Žádosti v cyklu.
    Musíte jasně pochopit, že SQL je jazyk pro práci s množinami. Někdy je pro programátory, kteří jsou zvyklí myslet v rámci procedurálních jazyků, obtížné posunout své myšlení do jazyka množin. Toho lze dosáhnout zcela jednoduše přijetím jednoduchého pravidla – „nikdy neprovádějte dotazy ve smyčce“. Příklady, jak to lze provést:

    1. Vzorky
    $news_ids = get_list("SELECT news_id FROM today_news ");
    while($news_id = get_next($news_ids))
    $news = get_row("VYBERTE název, tělo zprávy FROM news WHERE news_id = ". $news_id);

    Pravidlo je velmi jednoduché – čím méně požadavků, tím lépe (i když jako každé pravidlo existují výjimky). Nezapomeňte na konstrukci IN(). Výše uvedený kód lze napsat v jednom dotazu:
    SELECT nadpis, tělo FROM dnešní_zprávy VNITŘNÍ PŘIPOJIT SE novinky USING(id_novinek)

    2. Vložky
    $log = parse_log();
    while($record = next($log))
    query("INSERT INTO logs SET value = ". $log["value"]);!}

    Je mnohem efektivnější zřetězit a provést jeden dotaz:
    INSERT INTO logs (hodnota) VALUES (...), (...)

    3. Aktualizace
    Někdy je potřeba aktualizovat více řádků v jedné tabulce. Pokud je aktualizovaná hodnota stejná, pak je vše jednoduché:
    AKTUALIZACE zpráv SET title="test" WHERE id IN (1, 2, 3).!}

    Pokud je změněná hodnota pro každý záznam jiná, lze to provést pomocí následujícího dotazu:
    AKTUALIZACE novinek SET
    titulek = PŘÍPAD
    KDYŽ news_id = 1 POTOM "aa"
    KDYŽ news_id = 2 POTOM "bb" KONEC
    WHERE news_id IN (1, 2)

    Naše testy ukazují, že takový požadavek je 2–3krát rychlejší než několik samostatných požadavků.

  • Provádění operací na indexovaných polích
    SELECT user_id FROM users WHERE blogs_count * 2 = $value

    Tento dotaz nebude používat index, i když je indexován sloupec blogs_count. Aby byl index použit, nesmí být v indexovaném poli v dotazu provedeny žádné transformace. U takových požadavků přesuňte konverzní funkce do jiné části:
    SELECT user_id FROM users WHERE blogs_count = $value / 2;

    Podobný příklad:
    SELECT user_id FROM uživatelů WHERE TO_DAYS (CURRENT_DATE) – TO_DAYS (registrováno)<= 10;

    Nepoužije index na registrované pole, zatímco
    SELECT user_id FROM users WHERE registrovaný >= DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY);
    vůle.

  • Načítání řádků pouze za účelem počítání jejich počtu
    $vysledek = mysql_query("SELECT * FROM tabulka", $odkaz);
    $num_rows = mysql_num_rows($vysledek);
    Pokud potřebujete vybrat počet řádků, které splňují určitou podmínku, použijte tabulkový dotaz SELECT COUNT(*) FROM místo výběru všech řádků pouze pro sčítání počtu řádků.
  • Načítání dalších řádků
    $vysledek = mysql_query("SELECT * FROM tabulka1", $odkaz);
    while($row = mysql_fetch_assoc($výsledek) && $i< 20) {

    }
    Pokud potřebujete načíst pouze n řádků, použijte LIMIT namísto zahození nadbytečných řádků v aplikaci.
  • Pomocí ORDER BY RAND()
    SELECT * FROM tabulka ORDER BY RAND() LIMIT 1;

    Pokud má tabulka více než 4-5 tisíc řádků, pak ORDER BY RAND() bude fungovat velmi pomalu. Mnohem efektivnější by bylo spustit dva dotazy:

    Pokud má tabulka primární klíč auto_increment a žádné mezery:
    $rnd = rand(1, dotaz("VYBRAT MAX(id) Z tabulky"));
    $row = query("SELECT * FROM table WHERE id = ".$rnd);

    Nebo:
    $cnt = dotaz("SELECT COUNT(*) FROM tabulky");
    $row = query("SELECT * FROM table LIMIT ".$cnt.", 1");
    což však může být také pomalé, pokud je v tabulce velmi velký počet řádků.

  • Používání velké množství PŘIPOJTE SE
    VYBRAT
    v.video_id
    jméno,
    g.žánr
    Z
    videa AS v
    PŘIPOJIT SE VLEVO
    link_actors_videos AS la ON la.video_id = v.video_id
    PŘIPOJIT SE VLEVO
    herci JAKO ON a.actor_id = la.actor_id
    PŘIPOJIT SE VLEVO
    link_genre_video AS lg ON lg.video_id = v.video_id
    PŘIPOJIT SE VLEVO
    žánry AS g ON g.genre_id = lg.genre_id

    Je třeba si uvědomit, že při spojování tabulek one-to-many se počet řádků ve výběru zvýší s každým dalším JOIN For podobné případy Může být rychlejší rozdělit takový požadavek na několik jednoduchých.

  • Pomocí LIMIT
    SELECT… FROM table LIMIT $start, $per_page

    Mnoho lidí si myslí, že takový dotaz vrátí $ za_stránku záznamů (obvykle 10-20), a proto bude fungovat rychle. Na prvních stránkách to bude fungovat rychle. Ale pokud je počet záznamů velký a potřebujete provést dotaz SELECT... FROM table LIMIT 1000000, 1000020, pak k provedení takového dotazu MySQL nejprve vybere 1000020 záznamů, zahodí první milion a vrátí 20. nemusí být vůbec rychlé. Neexistují žádné triviální způsoby, jak problém vyřešit. Mnozí jednoduše omezují počet dostupných stránek na rozumný počet. Takové dotazy můžete také urychlit pomocí krycích indexů popř řešení třetích stran(například sfinga).

  • Nepoužívá se ON DUPLICATE KEY UPDATE
    $row = query("SELECT * FROM table WHERE id=1");

    If($row)
    dotaz("UPDATE table SET sloupec = sloupec + 1 WHERE id=1")
    jiný
    dotaz("INSERT INTO table SET sloupec = 1, id=1");

    Obdobnou konstrukci lze nahradit jedním požadavkem za předpokladu, že existuje primární resp jedinečný klíč podle pole id:
    INSERT INTO table SET sloupec = 1, id=1 ON DUPLICATE KEY UPDATE sloupec = sloupec + 1

Číst

V tomto článku se naučíme odesílání databázových dotazů přes PHP. Tento článek je velmi důležitý a musíte mu porozumět. Nicméně vás uklidním - materiál je velmi jednoduchý, takže by neměly být žádné potíže.

Než přejdu k tématu článku, předem upozorňuji, že nebudu podrobně rozebírat jazyk SQL . Všechny potřebné informace jsou seřazeny v kategorii věnované, ale zde pouze my práce s MySQL přes PHP.

Nyní přejděme k odesílání databázových dotazů v PHP:


}
$mysqli->query("INSERT INTO mytable (jméno, email) VALUES ("MyName", " [e-mail chráněný]")");
$mysqli->close();
?>

V v tomto příkladu připojili jsme se k databázi, zkontrolovali, zda bylo připojení úspěšné, odeslali požadavek pomocí metody dotaz() a poté spojení ukončili. Jak vidíte, vše je velmi jednoduché. Chcete-li poslat jakékoli SQL dotazy Stačí jedna metoda - dotaz(), takže v tomto případě je vše neuvěřitelně jednoduché.

Nyní si úkol trochu zkomplikujeme. Podívejme se na dotazy, které se vracejí sada_výsledků- výsledek. Většina populární žádost, vracející se sada_výsledků je výběr dat z tabulky. V následujícím příkladu navzorkujeme data a poté zobrazíme výsledek:

$mysqli = @new mysqli("localhost", "Admin", "pass", "mybase");
if (mysqli_connect_errno()) (
echo "Připojení selhalo: ".mysqli_connect_error();
}
$result_set = $mysqli->
while ($row = $result_set->fetch_assoc()) (
print_r($řádek);
echo"
";
}
$result_set->close();
$mysqli->close();
?>

Nejprve mi dovolte trochu vysvětlit, co to je. sada_výsledků. Sada_výsledků- toto je tabulka s výsledkem. Tato tabulka má sadu záznamů (řádky tabulky). A chcete-li zobrazit všechny záznamy, musíte iterovat každý řádek tabulky a zobrazit jej. A nyní vysvětlím na příkladu: po odeslání požadavku vygenerujeme sada_výsledků. Poté přiřadíme do proměnné ve smyčce řádek hodnotu dalšího řádku, tedy jednorozměrného pole, které metoda vrací fetch_assoc(). Když všechny řádky skončí, metoda fetch_assoc() vrátí se Nepravdivé a smyčka bude ukončena. Uvnitř smyčky zatímco pouze vypíšeme pole pomocí funkce ladění print_r(), i když by se to dalo jistě odvodit pomocí pro každého, ale nyní to není nutné.

Stručně si shrňme, jak s ním pracovat sada_výsledků:

  1. Dostat sada_výsledků odesláním odpovídajícího požadavku do databáze.
  2. Ve smyčce při každé iteraci přiřaďte další řádek(záznam) od sada_výsledků pomocí metody fetch_assoc() nějakou proměnnou řádek. Dále můžete s touto proměnnou pracovat jako s jednorozměrnou asociativní pole, ve kterém jsou klíče názvy polí tabulky a hodnoty odpovídají aktuálnímu záznamu.
  3. Nezapomeňte zavřít sada_výsledků metoda zavřít() odčerpat zdroje.

Jak jste si všimli, metoda fetch_assoc() vždy vrátí další záznam. Tedy nejprve 1., pak 2., pak 3. a tak dále. Pokud máte dobré zkušenosti s programováním, pak hned uhodnete, že se tak děje díky internímu ukazateli, se kterým můžete samozřejmě pohybovat. Kde se používá? To lze například použít, když potřebujete pracovat sada_výsledků Ne 1 , A 2 a vícekrát. Chcete-li se vyhnout opětovnému generování stejného požadavku, můžete jednoduše přesunout ukazatel na začátek. A pak můžete znovu začít s hrubou silou sada_výsledků pomocí metody fetch_assoc().

Existuje způsob, jak změnit polohu ukazatele data_seek(), který bere celé číslo z 0 před " počet záznamů - 1", proto je ukazatel umístěn na položku odpovídající parametru:

$mysqli = @new mysqli("localhost", "Admin", "pass", "mybase");
if (mysqli_connect_errno()) (
echo "Připojení selhalo: ".mysqli_connect_error();
}
$result_set = $mysqli->query("SELECT * FROM mytable");
$result_set->num_rows;
while ($row = $result_set->fetch_assoc()) (
print_r($řádek);
echo"
";
}
$result_set->data_seek(0);
while ($row = $result_set->fetch_assoc()) (
print_r($řádek);
echo"
";
}
$result_set->close();
$mysqli->close();
?>

V tomto příkladu máme výstup počet záznamů v sadě výsledků užívání majetku počet_řádků. Seznámili jsme se i s metodou data_seek(). To znamená, že jsme iterovali celý výsledek a pak jsme vrátili ukazatel na 0 záznam a znovu prošel výsledek.

V tomto článku jsme zopakovali připojení k databázi a uzavření připojení. A také zjistil jak se dotazovat do databáze přes PHP. Naučil se, jak získat result_set a jak s tím pracovat. To je vše, co potřebujete vědět, abyste byli úspěšní práce s MySQL v PHP.

Jak optimalizovat dotazy MySQL?


U běžného, ​​nijak zvlášť navštěvovaného webu není velký rozdíl, zda jsou dotazy MySQL do databáze optimalizovány nebo ne. Ale pro produkční servery pod těžký náklad rozdíl mezi správným a nesprávným SQL je obrovský a za běhu mohou výrazně ovlivnit chování a spolehlivost služeb. V tomto článku se podívám na to, jak psát rychlé dotazy a na faktory, které je zpomalují.

Proč MySQL?

Dnes se hodně mluví o Dig Data a dalších nových technologiích. NoSQL a cloudová řešení to je skvělé, ale spousta populárního softwaru (jako WordPress, phpBB, Drupal) stále běží na MySQL. Migrace do nejnovější řešení může vést nejen ke změně konfigurace na serverech. Navíc efektivita MySQL je stále na úrovni, zejména verze Percona.

Nedělejte běžnou chybu, že při řešení problému pomalých dotazů házíte stále více a více hardwaru vysoké zatížení servery - je lepší jít ke kořenům problémů. Zvýšený výkon procesoru a pevné disky a přidávání paměť s náhodným přístupem to je také určitý typ optimalizace, nicméně o tom si v tomto článku nebudeme povídat. Také optimalizací webu a vyřešením problému s hardwarem poroste zátěž jen exponenciálně. Jedná se tedy pouze o krátkodobé řešení.

Dobrá znalost SQL je nejdůležitějším nástrojem pro vývojáře webu, který vám umožní efektivně optimalizovat a používat relační databáze data. V tomto článku se zaměříme na populární Otevřít databázi data, často používaná ve spojení s PHP, a to je MySQL.

Pro koho je tento článek určen?

Pro webové vývojáře, databázové architekty a vývojáře a systémové administrátory obeznámené s MySQL. Pokud jste MySQL dosud nepoužívali, tento článek vám možná nebude k ničemu, ale přesto se pokusím být co nejvíce informativní a užitečný, a to i pro ty, kteří s MySQL začínají.

Nejprve zálohujte

Doporučuji provést následující kroky na základě báze MySQL, se kterou pracujete, ale nezapomeňte to udělat záložní kopie. Pokud nemáte databázi, se kterou byste mohli pracovat, uvedu tam, kde je to vhodné, příklady pro vytvoření vlastní databáze.

Vytváření záloh MySQL je snadné pomocí nástroje mysqldump:

$ mysqldump myTab > myTab-backup.sql Můžete se dozvědět více o mysqldump.

Co zpomaluje dotaz?

Zde je obecný seznam faktorů ovlivňujících rychlost požadavků a zatížení serveru:

  • indexy tabulek;
  • KDE stav (a použití vnitřní funkce MySQL, například, jako IF nebo DATE);
  • seřadit podle ORDER BY;
  • časté opakování stejných požadavků;
  • typ mechanismu ukládání dat (InnoDB, MyISAM, Memory, Blackhole);
  • nepoužíváte verzi Percona;
  • konfigurace serveru (my.cnf / my.ini);
  • velké datové výstupy (více než 1000 řádků);
  • nestabilní spojení;
  • distribuovaná nebo klastrová konfigurace;
  • Špatný design stolu.
Všem těmto problémům se budeme věnovat dále. Nainstalujte si také Percona, pokud tuto vestavěnou náhradu za standardní MySQL ještě nepoužíváte – výrazně zvýší výkon vaší databáze.

Co jsou indexy?

Indexy se v MySQL používají k vyhledávání řádků zadané hodnoty sloupce, například pomocí příkazu WHERE. Bez indexů musí MySQL počínaje prvním řádkem číst celou tabulku a hledat relevantní hodnoty. Jak další stůl, tím více nákladů.

Pokud tabulka obsahuje indexy ve sloupcích, které budou použity v dotazu, MySQL rychle najde umístění nezbytné informace bez zobrazení celé tabulky. To je mnohem rychlejší než prohledávání každého řádku postupně.

Nestabilní připojení?

Když se vaše aplikace připojí k databázi a je nakonfigurováno stabilní připojení, bude použita pokaždé, aniž byste museli pokaždé otevírat nové připojení. Tento optimální řešení pro pracovní prostředí.

Snížení častého opakování stejných požadavků

Nejrychlejší a účinná metodaŘešením, které jsem pro to našel, je vytvoření úložiště dotazů a výsledků jejich provádění pomocí Memcached nebo Redis. S Memcache můžete výsledek svého dotazu snadno uložit do mezipaměti, například takto:

connect("localhost",11211); $cacheResult = $cache->get("key-name"); if($cacheResult)( //nepotřebuji dotaz $result = $cacheResult; ) else ( //spusťte dotaz $mysqli = mysqli("p:localhost","username","password","table" ); //přidej p: pro dlouhodobé uložení $sql = "VYBRAT * Z příspěvků LEVÉ PŘIPOJIT se userInfo using (UID) WHERE posts.post_type = "post" || posts.post_type = "článek" ORDER BY LIMIT 50" ; $mysqli->query($sql) $memc->set("key-name", $result->fetch_array(), MEMCACHE_COMPRESSED,86400 //Heslo $cacheResult do šablony $template->assign("); příspěvky", $cacheResult); ?> Nyní bude těžký dotaz pomocí LEFT JOIN proveden pouze jednou za 86 400 sekund (tedy jednou denně), což výrazně sníží zatížení serveru MySQL a ponechá zdroje pro další připojení.

Poznámka: Chcete-li vytvořit trvalé připojení, přidejte p: na začátek argumentu hostitele MySQLi.

Distribuovaná nebo klastrovaná konfigurace

Když je dat stále více a rychlost vašich služeb klesá, může vás zachvátit panika. Rychlé řešení se může stát distribucí zdrojů (sharding). Nedoporučuji to však dělat, pokud nemáte dobrá zkušenost, protože distribuce ze své podstaty činí datové struktury složitými.

Slabý design stolu

Vytváření databázových schémat není těžká práce, pokud budete dodržovat zlatá pravidla práce s omezeními a vědět, co bude fungovat. Například ukládání obrázků do buněk BLOB je velmi matoucí – uložení cesty k souboru do buňky VARCHAR je mnohem lepší řešení.

Zajištění správného návrhu pro požadované použití je nejdůležitější při vytváření vaší aplikace. Ukládejte různá data do různých tabulek (například kategorií a článků) a ujistěte se, že vztahy mnoho ku jedné a jedna k mnoha lze snadno přiřadit k ID. Použití FOREIGN KEY v MySQL je ideální pro ukládání kaskádových dat v tabulkách.

Při vytváření tabulky pamatujte na následující:

  • Vytvářejte efektivní tabulky, které vyřeší vaše problémy, spíše než zaplňování tabulek zbytečnými daty a vztahy.
  • Neočekávejte, že MySQL spustí vaši obchodní logiku nebo programování – data musí být připravena pro vložení vašeho řádku skriptovací jazyk. Pokud například potřebujete seřadit seznam v náhodném pořadí, udělejte to v pole PHP bez použití ORDER BY z arzenálu MySQL.
  • Použijte UNIQUE indexové typy pro jedinečné datové sady a použijte ON DUPLICATE KEY UPDATE k udržení aktuálního data, například abyste věděli, kdy byl řádek v naposledy změněno.
  • K ukládání celých čísel použijte datový typ INT. Pokud neurčíte velikost datového typu, MySQL to udělá za vás.
Základy optimalizace

Pro efektivní optimalizace Na vaši aplikaci bychom měli použít tři přístupy:

  1. Analýza (protokolování pomalých dotazů, studium systému, analýza dotazů a návrh databáze)
  2. Požadavky na provedení (kolik uživatelů)
  3. Technologická omezení (rychlost žehličky, zneužít MySQL)
Analýza může být provedena několika způsoby. Nejprve se podíváme na nejviditelnější způsoby, jak nahlédnout pod pokličku vašeho MySQL, kde běží dotazy. Úplně prvním optimalizačním nástrojem ve vašem arzenálu je EXPLAIN. Pokud přidáte tento příkaz před svůj dotaz SELECT, bude výsledek dotazu vypadat takto:

Sloupce, vidíte, uložte důležitá informace o žádosti. Sloupce, kterým byste měli věnovat největší pozornost, jsou possible_keys a Extra.

Sloupec possible_keys zobrazí indexy, ke kterým měla MySQL přístup za účelem provedení dotazu. Někdy je potřeba přiřadit indexy, aby váš dotaz běžel rychleji. Sloupec Extra bude indikovat, zda bylo použito další WHERE nebo ORDER BY. Nejdůležitější věcí, kterou si musíte všimnout, je, zda je ve výstupu položka Použít třídění souborů.

Co dělá použití Filesort je uvedeno v nápovědě MySQL:

MySQL musí provést další průchod, aby zjistil, jak vrátit řádky v seřazené podobě. K tomuto řazení dochází iterací přes všechny řádky podle typu spojení a uložením klíče řazení a ukazatele řádku pro všechny odpovídající řádky podmíněný výraz KDE. Klíče jsou seřazeny a řádky jsou vráceny ve správném pořadí.
Další povolení zpomalí vaši aplikaci a je třeba se mu za každou cenu vyhnout. Dalším kritickým výsledkem Extra, kterému bychom se měli vyhnout, je použití dočasného. Říká, že MySQL muselo vytvořit dočasnou tabulku pro provedení dotazu. Očividně je to hrozné pomocí MySQL. V tomto případě by měl být výsledek dotazu uložen v Redis nebo Memcache a neměl by být znovu spuštěn uživateli.

Abychom se vyhnuli problému s použitím Filesort, musíme se ujistit, že MySQL používá INDEX. V současné době existuje několik klíčů specifikovaných v possible_keys, ze kterých si můžete vybrat, ale MySQL může pro konečný dotaz vybrat pouze jeden index. Indexy se také mohou skládat z několika sloupců a můžete také zadávat rady pro optimalizátor MySQL směřující na indexy, které jste vytvořili.

Hinting indexu

Optimalizátor MySQL použije statistiky založené na tabulkových dotazech k výběru nejlepšího indexu pro spuštění dotazu. Funguje docela jednoduše, na základě vestavěné statistické logiky, takže když má několik možností, ne vždy to funguje správná volba bez pomoci napovídání. Abyste zajistili, že byl použit správný (nebo nesprávný) klíč, použijte ve svém dotazu klíčová slova FORCE INDEX, USE INDEX a IGNORE INDEX. Více o indexovém hintingu si můžete přečíst v nápovědě MySQL.

Chcete-li zobrazit klávesy tabulky, použijte příkaz SHOW INDEX. Pro použití optimalizátorem můžete zadat několik rad.

Kromě EXPLAIN je zde klíčové slovo DESCRIBE. Pomocí DESCRIBE můžete zobrazit informace o tabulce následovně:

Přidání indexu

Chcete-li přidat indexy do MySQL, musíte použít syntaxi CREATE INDEX. Existuje několik typů indexů. FULLTEXT se používá pro fulltextové vyhledávání a UNIQUE slouží k ukládání jedinečných dat.

Chcete-li do tabulky přidat index, použijte následující syntaxi:

Mysql> CREATE INDEX idx_bookname ON `books` (bookname(10)); Tím se v tabulce knih vytvoří rejstřík, který bude používat prvních 10 písmen sloupce, ve kterém jsou uloženy názvy knih, a je typu varchar. V tomto případě jakékoli hledání pomocí dotazu WHERE na název knihy se shodou do 10 znaků poskytne stejný výsledek jako prohledání celé tabulky od začátku do konce.

Složené indexy

Indexy mají velký vliv na rychlosti vyřízení dotazu. Pouhé přiřazení hlavního jedinečného klíče nestačí – složené klíče ano skutečná oblast aplikací v nastavení MySQL, což někdy vyžaduje některé A/B kontroly pomocí EXPLAIN.

Pokud například potřebujeme odkazovat na dva sloupce v podmínce klauzule WHERE, ideálním řešením by byl složený klíč.

Mysql> CREATE INDEX idx_composite ON users(uživatelské jméno, aktivní); Jakmile máme vytvořený klíč založený na sloupci uživatelské jméno, ve kterém je uloženo jméno uživatele a aktivní sloupce typu ENUM, které určuje, zda je jeho účet aktivní. Nyní je vše optimalizováno pro dotaz, který použije WHERE k nalezení platného uživatelského jména s aktivním účtem (aktivní = 1).

Jak rychlé je vaše MySQL?

Pojďme si zapnout profilování, abychom se blíže podívali na dotazy MySQL. To lze provést tím, že to uděláte nastavit příkaz profilování=1, po kterém pro zobrazení výsledku musíte spustit show profiles.

Pokud používáte PDO, spusťte následující kód:

$db->query("set profiling=1"); $db->query("vyberte nadpis, tělo, značky z příspěvků"); $rs = $db->query("zobrazit profily"); $db->query("set profiling=0"); // deaktivace profilování po provedení dotazu $records = $rs->fetchAll(PDO::FETCH_ASSOC); // získání výsledků profilování $errmsg = $rs->errorInfo(); //Zde zachyťte nějaké chyby Totéž lze provést pomocí mysqli:

$db = new mysqli($host,$username,$password,$dbname); $db->query("set profiling=1"); $db->query("vyberte nadpis, tělo, značky z příspěvků"); if ($result = $db->query("ZOBRAZIT profily", MYSQLI_USE_RESULT)) ( while ($row = $result->fetch_row()) ( var_dump($row); ) $result->close(); ) if ($result = $db->query("zobrazit profil pro dotaz 1", MYSQLI_USE_RESULT)) ( while ($row = $result->fetch_row()) ( var_dump($row); ) $result->close( ) $db->query("set profiling=0"); To vám vrátí profilovaná data obsahující čas provedení dotazu ve druhém prvku asociativního pole.

Array(3) ( => string(1) "1" => string(10) "0.00024300" => string(17) "vyberte nadpis, tělo, značky z příspěvků" ) Dokončení tohoto dotazu trvalo 0,00024300 sekund. Je to docela rychlé, takže se nebojme. Ale když se čísla zvětší, musíme se podívat hlouběji. Přejděte do své aplikace a procvičte si pracovní příklad. Zkontrolujte konstantu DEBUG v konfiguraci databáze a poté začněte prozkoumávat systém povolením výstupu profilování pomocí funkcí var_dump nebo print_r. Tímto způsobem se můžete ve své aplikaci pohybovat ze stránky na stránku a získat pohodlné profilování systému.

Kompletní audit databáze vašich webových stránek

Chcete-li provést úplný audit vašich požadavků, povolte protokolování. Někteří vývojáři webových stránek se obávají, že protokolování výrazně ovlivňuje provádění a dále zpomaluje požadavky. Praxe však ukazuje, že rozdíl je zanedbatelný.

Chcete-li povolit protokolování v MySQL 5.1.6, použijte globální proměnnou log_slow_queries, můžete také označit soubor pro protokolování pomocí proměnné slow_query_log_file. To lze provést spuštěním následujícího dotazu:

Nastavit globální log_slow_queries = 1; set global slow_query_log_file = /dev/slow_query.log; Můžete to také zadat v konfiguračních souborech /etc/my.cnf nebo my.ini vašeho serveru.

Po provedení změn nezapomeňte restartovat MySQL server potřebný příkaz např. restart služby mysql, pokud používáte Linux.

Ve verzích MySQL po 5.6.1 je proměnná log_slow_queries zastaralá a místo ní se používá slow_query_log. Pro pohodlnější ladění můžete také povolit výstup tabulky nastavením proměnné log_output na TABLE, nicméně tato funkce je dostupná až od MySQL 5.6.1.

Log_output = TABLE; log_queries_not_using_indexes = 1; long_query_time = 1; Proměnná long_query_time určuje počet sekund, po kterých je dotaz považován za pomalý. Hodnota je 10 a minimum je 0. Můžete také zadat milisekundy pomocí zlomku; teď jsem naznačil vteřinu. A nyní je každý požadavek, který bude proveden déle než 1 sekundu, zaznamenán do protokolů v tabulce.

Protokolování bude provedeno do tabulek mysql.slow_log a mysql.general_log vaší databáze MySQL. Chcete-li protokolování vypnout, změňte log_output na NONE.

Přihlášení na produkčním serveru

Na produkčním serveru, který obsluhuje klienty, je lepší používat protokolování pouze na krátkou dobu a hlídat zátěž, aby nedocházelo ke zbytečné zátěži. Pokud je vaše služba přetížená a je potřeba okamžitá pozornost, zkuste problém izolovat spuštěním SHOW PROCESSLIST nebo přístupem k tabulce information_schema.PROCESSLIST spuštěním SELECT * FROM information_schema.PROCESSLIST;.

Protokolování všech požadavků na produkčním serveru vám může poskytnout spoustu informací a stát se dobrý lék pro výzkumné účely při kontrole projektu, ale protokoly za dlouhá období vám mnoho nedají užitečné informace ve srovnání s protokoly po dobu až 48 hodin (zkuste sledovat špičková zatížení mít šanci lépe prozkoumat provádění dotazu).

Poznámka: Pokud máte web, který občas zažívá vlny provozu a občas malý až žádný provoz, například sportovní web mimo sezónu, použijte tyto informace k vytváření a studiu protokolování.

Protokolování více požadavků

Nejen, že je důležité si být vědom dotazů, jejichž provedení trvá déle než sekundu, ale také si musíte být vědomi dotazů, které jsou spouštěny stovkykrát. I když jsou dotazy prováděny rychle, v zaneprázdněném systému mohou spotřebovat všechny zdroje.

To je důvod, proč byste měli být vždy ve střehu po provedení změn v živém projektu - to je nejvíce kritický čas pro provoz libovolné databáze.

Horká a studená cache

Počet požadavků a zatížení serveru mají silný dopad na provádění a mohou také ovlivnit dobu provádění požadavků. Při vývoji byste měli stanovit pravidlo, že dokončení každého požadavku na bezplatném serveru by nemělo trvat déle než zlomek milisekundy (0,0xx nebo rychleji).

Použití Memcache má silný vliv na zatížení serverů a uvolní zdroje, které provádějí požadavky. Ujistěte se, že používáte Memcached efektivně a otestovali jste svou aplikaci pomocí horké mezipaměti (načtená data) a studené mezipaměti.

Abyste se vyhnuli běhu na produkčním serveru s prázdnou mezipamětí, je dobré mít skript, který před spuštěním serveru shromáždí veškerou nezbytnou mezipaměť, aby velký příliv klientů nezkrátil dobu spouštění systému.

Oprava pomalých dotazů

Nyní, když je protokolování nastaveno, možná jste na svém webu našli nějaké pomalé dotazy. Pojďme je opravit! Jako příklad uvedu několik běžných problémů a můžete vidět logiku jejich řešení.

Pokud jste ještě nenašli pomalý dotaz, zkontrolujte nastavení long_query_time, pokud používáte tuto metodu protokolování. V opačném případě po kontrole všech vašich profilovacích dotazů (nastavení profilování=1) vytvořte seznam dotazů, které zabírají více času než zlomek milisekundy (0,000x sekund) a začněte od něj.

Běžné problémy

Zde je šest nejčastějších problémů, které jsem našel při optimalizaci dotazů MySQL:

ORDER BY a řazení souborů

Zabránění řazení souborů někdy není možné kvůli klauzuli ORDER BY. Pro optimalizaci uložte výsledek do Memcache nebo proveďte řazení v logice aplikace.

Pomocí ORDER BY s WHERE a LEFT JOIN

ORDER BY velmi zpomaluje dotazy. Pokud je to možné, snažte se nepoužívat ORDER BY. Pokud potřebujete řazení, použijte řazení podle indexů.

Pomocí ORDER BY na dočasných sloupcích

Prostě to nedělej. Pokud potřebujete spojit výsledky, udělejte to ve své aplikační logice; V dočasné tabulce dotazů MySQL nepoužívejte filtrování ani řazení. To vyžaduje mnoho zdrojů.

Ignorování FULLTEXTOVÉHO indexu

Používání LIKE je nejvíce Nejlepší způsob dělat fulltextové vyhledávání pomalý.

Zbytečný výběr velkého počtu řádků

Pokud ve svém dotazu zapomenete na LIMIT, může to značně prodloužit čas potřebný k načtení z databáze v závislosti na velikosti tabulek.

Nadměrný pomocí JOIN místo vytváření složených tabulek nebo pohledů

Když v jednom dotazu použijete více než tři nebo čtyři operátory LEFT JOIN, zeptejte se sami sebe: je zde vše správně? Pokračujte, pokud k tomu nemáte dobrý důvod, například - dotaz se nepoužívá často pro výstup v panelu správce nebo lze výsledek výstupu uložit do mezipaměti. Pokud potřebujete spustit dotaz s velké množství operace spojení tabulek, pak je lepší přemýšlet o vytváření složených tabulek z potřebných sloupců nebo pomocí pohledů.

Tak

Probrali jsme základy optimalizace a nástroje potřebné k provedení práce. Prozkoumali jsme systém pomocí profilování a příkazu EXPLAIN, abychom viděli, co se děje s databází, a pochopili, jak lze návrh zlepšit.

Podívali jsme se také na některé příklady a klasická úskalí, do kterých se můžete při používání MySQL dostat. Pomocí indexového hintingu můžeme zajistit, že MySQL vybere potřebné indexy, zvláště když je na stejné tabulce provedeno více výběrů. Chcete-li pokračovat ve studiu tématu, doporučuji vám podívat se na projekt Percona.

DBMS MySQL je jednou z mnoha databází podporovaných v PHP. Systém MySQL je distribuován zdarma a má dostatečný výkon pro řešení skutečných problémů.

Stručný úvod do MySQL

SQL je zkratka pro slova strukturovaný dotazovací jazyk, což znamená strukturovaný jazykžádosti. Tento jazyk je standardním prostředkem pro přístup různé databáze data.

Systém MySQL je server, ke kterému se mohou připojit uživatelé na vzdálených počítačích.

Pro práci s databázemi je vhodné použít nástroj, který je součástí sady Web Developer Kit: Denwer phpMyAdmin. Zde můžete vytvořit novou databázi, vytvořit novou tabulku ve vybrané databázi, naplnit tabulku daty a přidávat, mazat a upravovat data.

MySQL definuje tři základní typúdaje: číslice, datum a čas a malá písmena. Každá z těchto kategorií je rozdělena do mnoha typů. Ty hlavní:


Každý sloupec obsahuje po svém datovém typu další specifikátory:

TypPopis
NENULOVÝVšechny řádky tabulky musí mít v tomto atributu hodnotu. Pokud není zadáno, pole může být prázdné (NULL)
AUTO_INCREMENTSpeciální funkce MySQL, kterou lze použít na číselné sloupce. Pokud při vkládání řádků do tabulky necháte toto pole prázdné, MySQL automaticky vygeneruje jedinečnou hodnotu ID. Tato hodnota bude ještě jedna maximální hodnota, který již ve sloupci existuje. Každá tabulka nemůže mít více než jedno takové pole. Sloupce s AUTO_INCREMENT musí být indexovány
PRIMÁRNÍ KLÍČSloupec je primární klíč tabulky. Údaje v tomto sloupci musí být jedinečné. MySQL tento sloupec automaticky indexuje
NEPODEPSANÝPo typu celé číslo znamená, že jeho hodnota může být kladná nebo nulová
KOMENTÁŘNázev sloupce tabulky

Stvoření nová základna Data MySQL VYTVOŘIT DATABÁZI.

VYTVOŘIT DATABÁZI, POKUD NEEXISTUJE `base` VÝCHOZÍ SADA ZNAKŮ cp1251 COLLATE cp1251_bin

Vytvoření nové tabulky provádí pomocí příkazu SQL VYTVOŘIT TABULKU. Například tabulka knih pro knihkupectví bude obsahovat pět polí: ISBN, autor, název, cena a počet výtisků:

CREATE TABLE books (ISBN CHAR(13) NOT NULL, PRIMARY KEY (ISBN), autor VARCHAR(30), title VARCHAR(60), price FLOAT(4,2), množství TINYINT UNSIGNED); Chcete-li se vyhnout chybové zprávě, pokud tabulka již existuje, musíte změnit první řádek přidáním fráze „IF NOT EXISTS“: CREATE TABLE IF NOT EXISTS books ...

Pro tvoření pole automatické aktualizace s aktuálním datem Typ TIMESTAMP nebo DATETIME použijte následující konstrukci:

CREATE TABLE t1 (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);

Přidání data do této tabulky se provádějí pomocí příkazu SQL VLOŽIT. Například:

INSERT INTO books (ISBN, autor, název, cena, množství) VALUES ("5-8459-0184-7", "Zandstra Mat", "Ovládněte PHP4 sami za 24 hodin", "129", "5") ;

Chcete-li načíst data z tabulky, použijte operátor VYBRAT. Získává data z databáze výběrem řádků, které odpovídají danému kritériu vyhledávání. Příkaz SELECT přichází s celou řadou možností a případů použití.

* označuje, že všechna pole jsou povinná. Například:

VYBRAT * Z knih;

Chcete-li získat přístup pouze k určitému poli, musíte zadat jeho název v příkazu SELECT. Například:

VYBERTE autora, název, cenu FROM knih;

Chcete-li získat přístup k podmnožině řádků v tabulce, musíte zadat kritérium výběru, které specifikuje konstrukci KDE. Chcete-li například vybrat dostupné levné knihy o PHP, musíte vytvořit dotaz:

SELECT * FROM books WHERE price % Odpovídá libovolnému počtu znaků, dokonce i nulovým
_ Odpovídá přesně jednomu znaku

Aby bylo zajištěno, že řádky načtené dotazem budou uvedeny v určitém pořadí, použije se konstrukce SEŘADIT PODLE. Například:

VYBRAT * Z knih OBJEDNAT PODLE ceny;

Výchozí objednat třídění jde vzestupně. Pořadí řazení můžete obrátit pomocí klíčového slova DESC:

VYBRAT * Z knih OBJEDNAT PODLE ceny DESC;

Seřadit Je také možné pro několik sloupců. Místo názvů sloupců můžete použít jejich sériová čísla:

VYBRAT * Z knih OBJEDNAT DO 4, 2, 3;

Chcete-li změnit hodnoty dříve zaznamenané v tabulce, musíte použít příkaz AKTUALIZACE. Například cena všech knih byla zvýšena o 10 %:

AKTUALIZACE knih SET cena = cena * 1.1;

Klauzule WHERE omezí operaci UPDATE na určité řádky. Například:

AKTUALIZACE knih SET cena = cena * 1,05 KDE cena

Chcete-li odstranit řádky z databáze, použijte operátor VYMAZAT. Nepotřebné řádky jsou specifikovány pomocí klauzule WHERE. Některé knihy byly například prodány:

DELETE FROM books WHERE množství = 0;

Pokud potřebujete smazat všechny záznamy

TRUNCATE TABLE název_tabulky

Pro úplné odstranění používají se tabulky:

DROP TABLE název_tabulky

Propojení PHP s MySQL databází

Po práci s phpMyAdminem na vytvoření databáze můžete začít připojovat databázi k externímu webovému rozhraní.

Chcete-li přistupovat k databázi z webu pomocí PHP, musíte provést následující základní kroky:

  • Připojení k serveru MySQL.
  • Výběr databáze.
  • Provedení databázového dotazu:
    • přidání;
    • vymazání;
    • změna;
    • Vyhledávání;
    • třídění.
  • Získání výsledku požadavku.
  • Odpojte se od databáze.

Pro připojení k databázovému serveru v PHP existuje funkce mysql_connect(). Jeho argumenty jsou název počítače, uživatelské jméno a heslo. Tyto argumenty lze vynechat. Ve výchozím nastavení je název počítače = localhost , uživatelské jméno a heslo pak nejsou vyžadovány. Pokud se PHP používá v kombinaci se serverem Apache, můžete funkci použít mysql_pconnect(). V tomto případě připojení k serveru nezmizí po ukončení programu nebo po zavolání funkce mysql_close(). Funkce mysql_connect() A mysql_pconnect() vraťte ID připojení, pokud bylo vše úspěšné. Například:

$link = mysql_pconnect(); if (!$link) die ("Nelze se připojit k MySQL");

Po spojení s MySQL server nainstalován, musíte vybrat databázi. K tomu použijte funkci mysql_select_db(). Jeho argumentem je název databáze. Funkce vrátí hodnotu true, pokud zadaná databáze existuje a lze k ní přistupovat. Například:

$db = "vzorek"; mysql_select_db($db) or die("Nelze otevřít $db");

Chcete-li přidat, odstranit, upravit a vybrat data, musíte sestavit a spustit dotaz SQL. V PHP na to existuje funkce mysql_query(). Jeho argument: řetězec dotazu. Funkce vrátí ID požadavku.

Příklad 1

Přidání záznamu do tabulky

Při každém provedení příkladu 1 bude do tabulky obsahující stejná data přidán nový záznam. Samozřejmě má smysl přidávat do databáze data zadaná uživatelem.

Příklad 2.1 ukazuje HTML formulář pro přidávání nových knih do databáze.

Příklad 2.1

HTML formulář pro přidávání nových knih
ISBN
Autor
název
Cena
Množství


Výsledky vyplnění tohoto formuláře jsou odeslány na adresu insert_book.php.

Příklad 2.2

Program pro přidávání nových knih (soubor insert_book.php) Vraťte se prosím zpět a dokončete psaní"); ) $isbn = trim ($_POST["isbn"]); $author = trim ($_POST["author"]); $title = trim ($_POST["title" ] ); $isbn = addlashes ($isbn); $db = "ukázka"; "Nelze se připojit k MySQL"; nebo zemřít ("Nelze otevřít $db" $query = "INSERT INTO books VALUES ("" .$isbn."), "".$author. "", "".$title.",""); .floatval($_POST["cena"]).", "".intval($_POST["množství"])."")"; $result = mysql_query ($dotaz) if ($result) echo "The kniha byla přidána do databáze."; mysql_close ($link ?>);

V příkladu 2.2 jsou zadaná data řetězce zpracována funkcí lomítka(). Tato funkce přidává zpětná lomítka před jednoduché uvozovky ("), dvojité uvozovky("), zpětné lomítko (\) a nulový bajt. Faktem je, že podle požadavků syntaxe databázového dotazu musí být takové znaky uzavřeny v uvozovkách.

Chcete-li zjistit počet záznamů jako výsledek dotazu, použijte funkci mysql_num_rows().

Všechny záznamy výsledků dotazu lze prohlížet ve smyčce. Než to uděláte, použijte funkci mysql_fetch_ Pro každý záznam se získá asociativní pole.

Příklad 3.1 ukazuje HTML formulář pro vyhledávání konkrétních knih v databázi.

Příklad 3.1

HTML formulář pro vyhledávání knih
Vyhledávání podle:

Co hledáme:



Výsledky vyplnění tohoto formuláře jsou odeslány na adresu search_book.php.

Příklad 3.2

Vraťte se prosím zpět a dokončete psaní"); $searchterm = lomítka ($searchterm); $link = mysql_pconnect(); if (!$link) die("Nelze se připojit k MySQL"); $db = "sample"; mysql_select_db ($db) or die("Nelze otevřít $db" $query = "SELECT * FROM books WHERE " .$_POST["searchtype"]." jako "%".$searchterm."%""; $result = mysql_query ($query); $n = mysql_num_rows ($result); for ($i=0; $i<$n; $i++) { $row = mysql_fetch_array($result); echo "

".($i+1). $row["title"]."



"; ) if ($n == 0) echo "Nemáme co nabídnout. Omlouváme se"; mysql_close($link); ?>

Alternativní možnost

Program pro vyhledávání knih (soubor search_book.php) Vraťte se prosím zpět a dokončete psaní"); $searchterm = addlashes ($searchterm); mysql_connect() or die ("Nelze se připojit k MySQL"); mysql_select_db ("ukázka") nebo die ("Nelze otevřít databázi") $ výsledek = mysql_query("SELECT * FROM books WHERE ".$_POST["searchtype"].." jako "%".$searchterm."%"" while($row = mysql_fetch_array($result) ) (); echo"

".($i++) . $row["title"]."
"; echo "Autor: ".$row["author"]."
"; echo "ISBN: ".$row["ISBN"]."
"; echo "Cena: ".$row["price"]."
"; echo "Množství: ".$řádek["množství"]."

"; ) if ($i == 1) echo "Nemáme co nabídnout. Omlouváme se"; mysql_close(); ?>

Jak tedy funguje architektura webové databáze:

  1. Webový prohlížeč uživatele zadá požadavek HTTP pro konkrétní webovou stránku. Například uživatel pomocí formuláře HTML hledá všechny knihy o PHP. Stránka pro zpracování formuláře se nazývá search_book.php.
  2. Webový server obdrží požadavek na search_book.php, načte tento soubor a předá jej PHP enginu ke zpracování.
  3. PHP se připojí k serveru MySQL a odešle požadavek.
  4. Server přijme databázový požadavek, zpracuje jej a výsledek (seznam knih) odešle zpět do PHP enginu.
  5. PHP engine je dokončen provádění skriptu, formátuje výsledek požadavku v HTML. Poté je výsledek ve formě HTML vrácen na webový server.
  6. Webový server předá HTML do prohlížeče a uživatel si může prohlédnout požadovaný seznam knih.

Použití transakčního mechanismu

Použití transakčního mechanismu jako příkladu, jak převádět peníze z jedné osoby na druhou

If(mysql_query ("BEGIN") && mysql_query ("AKTUALIZOVAT SADA peněz amt = amt - 6 WHERE jméno = "Eva"") && mysql_query ("AKTUALIZOVAT SADA peněz amt = amt + 6 WHERE jméno = "Ida"") && mysql_query ("COMMIT"))( echo "Úspěšné"; )else( mysql_query ("ROLLBACK"); echo "Neúspěšné"; )

VYBERTE ... PRO AKTUALIZACI

Pokud spustíte více procesů, které provádějí výběrové dotazy ve stejné tabulce, mohou vybrat stejný záznam současně.

Aby se předešlo výše uvedené situaci, je nutné provést nejen SELECT dotaz, ale jeho rozšířenou verzi, kterou si mnozí ani neuvědomují: SELECT ... FOR UPDATE.

Tedy při provádění této žádosti, všechny dotčené záznamy v databázi budou uzamčeny, dokud nebude relace s databází dokončena nebo dokud nebudou aktualizována data záznamu. Jiný skript nebude moci vybrat blokované záznamy, dokud nenastane jedna ze zmíněných podmínek.

Nicméně, ne všechno tak jednoduché. Musíte splnit ještě několik podmínek. Za prvé, vaše tabulka musí být založena na architektuře InnoDB. Jinak blokování prostě nebude fungovat. Za druhé, před provedením výběru musíte zakázat automatické potvrzení dotazu. Tito. jinými slovy automatické provedenížádost. Po zadání Žádost o AKTUALIZACI, budete muset znovu přistupovat k databázi a potvrdit změny pomocí příkazu COMMIT:

V současné době může každý pozorovat rychlý růst objemu digitální informace. A protože většina těchto informací je důležitá, je potřeba si je uložit digitální média pro pozdější použití. V této situaci lze použít následující moderní technologie jako databáze. Poskytují bezpečné ukládání jakýchkoli digitálních informací a data jsou přístupná kdekoli na světě. Jednou z uvažovaných technologií je systém správy databází MySQL.

MySQL DBMS - co to je?

MySQL je jednou z nejpopulárnějších a nejčastěji používaných technologií pro ukládání informací. Jeho funkčnost je v mnoha ohledech lepší než stávající DBMS. Zejména jednou z hlavních funkcí je možnost používat vnořené dotazy MySQL.

Proto je na bázi MySQL DBMS vyvíjeno mnoho projektů, kde je důležitá rychlost a je nutné zajistit ukládání informací a také provádět komplexní vyhledávání dat. Většina tohoto vývoje jsou internetové stránky. Zároveň se MySQL aktivně zavádí do implementace jak malých (blogy, weby vizitek atd.), tak i poměrně velkých úloh (internetové obchody atd.). V obou případech se k zobrazení informací na webové stránce používá dotaz MySQL. V dotazu se vývojáři snaží maximálně využít dostupné možnosti poskytované systémem správy databází.

Jak by mělo být organizováno ukládání dat?

Pro pohodlné skladování a následném zpracování je nutné údaje objednat. Datová struktura vám umožňuje určit, jak budou vypadat tabulky používané k ukládání informací. Databázové tabulky jsou sada polí (sloupců) odpovědných za každou konkrétní vlastnost datového objektu.

Pokud se například sestaví tabulka zaměstnanců určité firmy, pak její nejvíce jednoduchá struktura budu mít další pohled. Každý zaměstnanec je přidělen jedinečné číslo, který se obvykle používá jako primární klíč ke stolu. Poté se do tabulky zadají osobní údaje zaměstnance. Může to být cokoliv: celé jméno, číslo oddělení, kterému je přidělen, telefonní číslo, adresa atd. Podle normalizačních požadavků (6 normální formy databáze), a také aby byly dotazy MySQL strukturovány, musí být pole tabulky atomická, to znamená, že nesmí obsahovat výčty ani seznamy. Proto jsou v tabulce zpravidla samostatná pole pro příjmení, jméno atd.

Ivanovič

Admin.

Ředitel

Petrovič

Admin.

Náměstek ředitelé

Gregory

Grigorjevič

Šéf

Sergejevič

Prodejní poradce.

Výše je triviální příklad struktury databázové tabulky. Základní požadavky normalizace však zatím zcela nesplňuje. V skutečné systémy Vytvoří se další tabulka oddělení. Proto by výše uvedená tabulka měla obsahovat čísla oddělení namísto slov ve sloupci „Oddělení“.

Jak jsou data vzorkována

Chcete-li získat data z tabulek v DBMS, použijte speciální tým MySQL- žádost Vybrat. Aby server správně odpověděl na požadavek, musí být požadavek správně vytvořen. Struktura požadavku je vytvořena následovně. Jakékoli volání databázového serveru začíná klíčovým slovem vybrat. Z toho jsou postaveny všechny dotazy v MySQL. Příklady se mohou lišit ve složitosti, ale princip konstrukce je velmi podobný.

Poté musíte určit, ze kterých polí chcete vybrat informace, které vás zajímají. Pole jsou uvedena oddělená čárkami za větou vybrat. Po všem povinná pole byly uvedeny, požadavek specifikuje objekt tabulky, ze kterého se provede výběr pomocí klauzule z a zadání názvu tabulky.

Pro omezení výběru jsou přidány dotazy MySQL speciální operátoři poskytuje DBMS. Chcete-li vybrat neopakující se (jedinečná) data, použijte klauzuli odlišný, a stanovit podmínky - provozovatel kde. Jako příklad použitelný pro výše uvedenou tabulku zvažte dotaz požadující informace o celém jméně. zaměstnanci v obchodním oddělení. Struktura požadavku bude vypadat jako v tabulce níže.

Koncept poddotazu

Ale hlavní funkcí DBMS, jak bylo zmíněno výše, je schopnost zpracovávat vnořené dotazy MySQL. jak by to mělo vypadat? Z názvu je logicky zřejmé, že se tvoří v určité hierarchii dvou a více dotazů. Teoreticky pro studium vlastností DBMS se říká, že MySQL neukládá omezení na počet dotazů MySQL, které mohou být vnořeny do hlavního dotazu. V praxi však můžete experimentovat a přesvědčit se, že po druhém tuctu vnořených požadavků se doba odezvy výrazně prodlouží. V každém případě v praxi neexistují úkoly, které by vyžadovaly použití extrémně složitý MySQL dotaz. Dotaz může vyžadovat maximálně 3–5 vnořených hierarchií.

Vytváření vnořených dotazů

Při analýze přečtených informací vyvstává řada otázek, kde lze vnořené dotazy použít a zda je možné problém vyřešit jejich rozdělením na jednoduché, aniž by to komplikovalo strukturu. V praxi se k řešení složitých problémů používají vnořené dotazy. Tento typ problému zahrnuje situace, kdy podmínka, kterou bude další vzorkování hodnot omezena, není předem známa. Je nemožné vyřešit takové problémy, pokud jednoduše použijete běžný MySQL dotaz. Dotaz sestávající z hierarchií bude hledat omezení, která se mohou v průběhu času měnit nebo nemusí být předem známa.

Pokud vezmeme v úvahu výše uvedenou tabulku, pak lze následující příklad uvést jako komplexní úkol. Řekněme, že potřebujeme zjistit základní informace o zaměstnancích podřízených Grigoriji Grigorieviči Grišinovi, který je Když formulujeme požadavek, neznáme jeho identifikační číslo. Proto to zpočátku potřebujeme vědět. K tomu použijte jednoduchý dotaz, který vám umožní najít řešení hlavního stavu a doplnit hlavní dotaz MySQL. Dotaz jasně ukazuje, že poddotaz obdrží identifikační číslo zaměstnance, které dále definuje omezení hlavního dotazu:

V tomto případě návrh žádný slouží k odstranění chyb, pokud je s takovými iniciály více zaměstnanců.

Výsledek

Abychom to shrnuli, je třeba poznamenat, že existuje mnoho dalších doplňkových funkcí, které výrazně usnadňují konstrukci dotazů, protože MySQL DBMS je výkonný nástroj s bohatým arzenálem nástrojů pro ukládání a zpracování dat.




Horní