Příklady dotazů na levé připojení SQL. MySQL JOIN: popis, příklad použití příkazu a doporučení

Nejnovější aktualizace: 1.11.2015

Jedním z hlavních způsobů, jak webová stránka přenáší data, je zpracování formulářů. Formuláře představují speciální prvky HTML značky, které obsahují různé prvky vstup - textová pole, tlačítka atd. A pomocí těchto formulářů můžeme zadat nějaká data a odeslat je na server. A server tato data již zpracovává.

Vytváření formulářů se skládá z následujících aspektů:

    Vytvoření prvku ve značce HTML

    Přidejte k tomuto prvku jedno nebo více vstupních polí

    Nastavení způsobu přenosu dat: GET nebo POST

    Nastavení adresy, na kterou budou zasílány zadané údaje

Pojďme tedy tvořit nová uniforma. K tomu definujeme nový soubor form.php , do kterého umístíme následující obsah:

Přihlášení na stránku Přihlášení:

Heslo:

Atribut action="login.php" formulářový prvek označuje, že data formuláře budou zpracována skriptem login.php, který bude umístěn se souborem formulář.php v jedné složce. A atribut method="POST" označuje, že jako metoda přenosu dat bude použita metoda POST.

Nyní vytvoříme soubor login.php, který bude mít následující obsah:

K získání dat formuláře se používá globální proměnná $_POST. Ona zastupuje asociativní pole data přenášená metodou POST. Pomocí klíčů můžeme získat odeslané hodnoty. Klíče v tomto poli jsou hodnoty atributů názvu vstupních polí formuláře.

Protože atribut názvu vstupní pole login má hodnotu login(), pak v poli $_POST bude hodnota tohoto pole představovat klíč "login": $_POST["login"]

A protože mohou nastat situace, kdy vstupní pole nebude nastaveno, například při přechodu přímo do skriptu: http://localhost:8080/login.php. V tomto případě je vhodné před zpracováním dat zkontrolovat dostupnost dat pomocí funkce isset(). A pokud je proměnná nastavena, pak funkce isset() vrátí true .

Nyní máme přístup k formuláři:

A kliknutím na tlačítko zadaná data Metoda POST bude odesláno do skriptu login.php:

Není nutné odesílat data formuláře do jiného skriptu, data formuláře můžete zpracovat ve stejném souboru formuláře. Chcete-li to provést, změňme soubor formulář.php následovně:

Přihlášení na stránku Přihlášení:

Heslo:

Zabezpečení dat

Bezpečnost dat je v PHP velmi důležitá. Podívejme se na několik jednoduchých mechanismů, které mohou zlepšit zabezpečení našeho webu.

Nejprve si ale vezměme formulář z předchozího tématu a zkusme do něj zadat nějaké údaje. Zadejte například „alert(hi);“ do pole přihlášení a „heslo“ do pole hesla:

Po odeslání dat na html označení vůle implementován kód javascript, který zobrazí okno se zprávou.

Abych se vyhnul podobné problémy Abyste byli v bezpečí, měli byste použít funkci htmlentities():

If(isset($_POST["login"]) && isset($_POST["heslo"]))( $login=htmlentities($_POST["login"]); $password = htmlentities($_POST["heslo" ]); echo "Vaše přihlašovací údaje: $login
Vaše heslo: $password";)

A to i po vstupu html kód nebo javascript budou všechny značky escapovány a dostaneme následující výstup:

Další funkce - funkce strip_tags() umožňuje zcela vyloučit html značky:

If(isset($_POST["login"]) && isset($_POST["heslo"]))( $login=strip_tags($_POST["login"]); $password = strip_tags($_POST["heslo" ]); echo "Vaše přihlašovací údaje: $login
Vaše heslo: $password";)

Výsledkem jeho činnosti se stejným vstupem bude následující výstup.

Kromě obvyklého jednoduché dotazy S jednoduché podmínky jazyk SQL umožňuje udělat docela složité výrazy, na jejichž vidle je někdy děsivý pohled, vypadají tak nepochopitelně. Takové dotazy se ale moc často nevyskytují a další úroveň složitosti po obvyklém SELECTu je podle mého názoru příkaz JOIN. Pojďme přijít na to, jak s tím pracovat.

Nejprve se podívejme na nejjednodušší často používané dotazy.

SELECT COUNT(*) FROM tabulka; //spočítat počet záznamů SELECT * FROM tabulka LIMIT 5,10; //počínaje 5. záznamem vybere 10 řádků. nejčastěji se používá pro navigaci po stránkách SELECT * FROM tabulka ORDER BY num; //seřadí všechny záznamy z tabulky podle pole num SELECT * FROM tabulka WHERE year="1990"; //vyber záznam/záznamy, kde je hodnota roku 1990 SELECT * FROM tabulka WHERE jméno LIKE "%ova%"; //hledá v tabulce jméno, které obsahuje sekvenci "ova" SELECT DISTINCT jméno FROM tabulka; //pokud existují duplicitní pole, budou započítána pouze jednou SELECT * FROM jméno WHERE age IN (12,15,18); // zobrazí jména, která odpovídají polím s věkem 12,15,18 SELECT MAX(age) FROM table; //MAX/MIN - vybere záznam s maximem popř minimální hodnota stáří

Nyní přejděme přímo k příkladům JOIN:

Velmi oblíbeným úkolem, kde se používá příkaz JOIN, je spojení několika tabulek, které mají nějaký druh společný rys. Podívejme se na příklad. Řekněme, že máme dva stoly. První obsahuje údaje o jménu a adrese uživatele a má také sloupec user_id. Ve druhém sloupci máme také sloupec user_id a sloupec s domovským indexem uživatele.

SELECT jméno, adresa FROM tabulka1 LEFT JOIN tabulka2 ON tabulka1.id_uzivatele=tabulka2.id_uzivatele;

Aby to bylo ještě přehlednější, lze tento dotaz přepsat klasickým způsobem:

SELECT tabulka1.název, tabulka1.adresa, tabulka2.index FROM tabulka1, tabulka2 WHERE tabulka1.id_uzivatele = tabulka2.id_uzivatele;

Tímto způsobem můžete získat data z několika tabulek, a pokud existuje další podmínka, přidáme je také:

SELECT jméno, adresa FROM tabulka1 LEFT JOIN tabulka2 ON tabulka1.id_uzivatele=tabulka2.id_uživatele WHERE jméno = "Vasya";

Pokud se ponoříme do teorie, dodáme, že existují následující možnosti JOIN:

Zde by bylo vhodné nakreslit slavné kruhy:

VNITŘNÍ SPOJENÍ

vrátí průnik dvou množin

SELECT t1.name, t2.city FROM Table1 t1 INNER JOIN Tabulka2 t2 ON t1.key2 = t2.key2;

Odrazem INNER JOIN je OUTER JOIN. Máme k dispozici tři typy OUTER JOIN - FULL, LEFT a RIGHT. Slovo OUTER není povinné.

PLNÉ PŘIPOJENÍ

Kombinuje dvě sady

FULL JOIN vrátí VŠECHNY záznamy z tabulek table a table2, bez duplicitních dat. Pokud nejsou k dispozici žádná data, bude nahrazena hodnotou NULL.

PŘIPOJIT SE VLEVO

Vrátí data z levé tabulky i data z pravé, která se protíná s levou.

Pokud není dostatek dat z pravé tabulky, bude nahrazena hodnotou NULL.

RIGHT JOIN – jak asi chápete, vrátí všechny hodnoty z pravé tabulky a protínající se data zleva.

Výjimky

Pokud potřebujeme data z první tabulky, pro kterou nejsou žádná data ve správné, pak stačí přidat klauzuli WHERE

SELECT t1.name, t2.city FROM Table1 t1 LEFT JOIN Tabulka2 t2 ON t1.key2 = t2.key2 WHERE t2.key2 IS NULL;

Více JOINů

Pomocí JOIN se můžete připojit nejen ke 2 stolům, ale k libovolnému počtu. Pokud se potřebujete připojit ke 2 stolům, budete potřebovat 2 Příkazy JOIN. Ale neměli byste jít do extrému a připojit se k hromadě tabulek, to vše bude mít významný dopad na výkon, takže někdy je lepší spustit několik poddotazů. Příklad spojení tří tabulek:

SELECT t1.Jméno, t2.Město, t3.Profese FROM Tabulka1 t1 INNER JOIN Tabulka2 t2 ON t1.key2 = t2.key2 INNER JOIN Tabulka3 t3 ON t1.key3 = t3.key3;

Doufám, že vám uvedené jednoduché příklady JOIN pomohly pochopit tento operátor.

I když to lze aplikovat i na vývoj standardu softwarových produktů, Pro místní použití. Ale o tom tento článek nebude mluvit.

Často je při práci s databázemi v jednotlivých jazycích úkolem provést výběr dat pro zobrazení v různých sestavách, grafech a podobně. Při implementaci tohoto druhu úlohy musíte zpravidla použít ne jednu, ale několik tabulek, které je spojují do jednoho dotazu, což výrazně komplikuje jeho návrh. V tomto případě je třeba vzít v úvahu, jak budou data vystupovat, jak se budou tabulky „vytahovat“ a jaký výsledek bude pro programátora nejpřijatelnější. K řešení takových problémů se používá jeden ze standardních návrhů jazyk MySQL- Připojte se.

Koncept slova připojit

Jazyky pro vývoj databáze, bez ohledu na to, o jaký jazyk se jedná, jsou založeny na standardních slovech z anglických slovníků (což je důvod, pokud víte anglický jazyk, bude pro vás mnohem jednodušší práce s tabulkami). Pro realizaci spojení tabulek s výběrem je použito stejné slovo - Join. Databázový programovací jazyk používá My SQL. Překlad tohoto funkčního slova je naprosto stejný jako v samotném jazyce – „sjednocení“.

Interpretace konstruktu MySQL - Join a kteréhokoli z nich bude naprosto stejná. Pokud dešifrujeme účel stavby, konkrétně schéma jejího fungování, dostaneme následující význam: stavby vám umožní shromáždit potřebná pole z různé tabulky nebo vnořené dotazy v jednom výběru.

Typy struktur pro kombinování

Pokud programátor potřebuje shromáždit vzorek z několika tabulek a ví, jaká klíčová pole v nich jsou a jaká data jsou potřeba pro sestavu, pak může k dosažení požadovaného výsledku použít jednu z hlavních konstrukcí spojení. Existují čtyři hlavní konstrukce (pro spojování stolů):

  • Vnitřní spojení.
  • Křížové spojení.
  • Levý spoj.
  • Správně Připojte se.
  • V závislosti na daném úkolu bude vyhovovat každý ze standardních provedení různé výsledky, která vám umožní přijímat zprávy o různé parametry v krátké době.

    Vytváření a naplňování tabulek pro pozdější použití

    Než začneme například uvažovat o mechanismech práce s konstrukcemi agregace dat, vyplatí se připravit několik tabulek, se kterými budeme v budoucnu pracovat. To pomůže názorně ukázat všechny principy fungování operátorů, navíc si tímto způsobem začátečníci snadněji osvojí všechny základy programování tabulek.

    V první tabulce budou popsány některé předměty, se kterými se člověk neustále setkává po celý život.

    Ve druhé tabulce popisujeme některé vlastnosti objektů z první tabulky, abyste s nimi mohli v budoucnu pracovat.

    Obecně budou stačit dvě tabulky, aby bylo vidět, jak fungují na příkladu. Nyní můžeme začít s praktickým zkoumáním našich návrhů.

    Použití vnitřního spojení

    Při použití konstruktu MySQL - Join Ineer se vyplatí zvážit některé jeho vlastnosti. Tento návrh vám umožní vybrat z obou tabulek pouze ty záznamy, které jsou v první i druhé tabulce. Jak to funguje? V první tabulce máme hlavní klíč- ID, které udává pořadové číslo záznamů v tabulce.

    Při vytváření druhé tabulky je použit stejný klíč jako pořadové číslo příklad je vidět na obrázcích. Při výběru dat operátor Select vyvolá pouze ty záznamy, které sériová čísla které se shodují - to znamená, že jsou v první i druhé tabulce.

    Při použití návrhu musíte přesně pochopit, jaká data potřebujete získat. Nejčastější chybou zejména začínajícího programátora je iracionální a zneužít Návrhy vnitřních spojů. Jak můžeme uvažovat o skriptu, který nám bude vracet informace o objektech a jejich vlastnostech z dříve popsaných a vyplněných tabulek. Zde však může být několik způsobů, jak strukturu použít. V tomto ohledu je My SQL velmi flexibilní jazyk. Můžeme se tedy podívat na příklady pomocí MySQL Vnitřní spojení.

    Kombinování tabulek bez zadání jakýchkoli parametrů. V tomto případě dostaneme následující výsledek:

    Pokud označíme přes funkční slovo Vezmeme-li v úvahu, že je nutné vzít v úvahu hlavní klíče záznamů v tabulkách, výsledek výběru se dramaticky změní. V tomto případě získáme výběr, který vrátí pouze ty řádky, které mají stejné primární klíče.

    Je také možná třetí možnost použití konstrukce, kdy dotaz používá slovo „on“ k označení polí, podle kterých mají být tabulky sloučeny. V tomto případě výběr vrátí následující údaje:

    Vlastnosti použití levého spojení

    Pokud zvážíme jiný způsob spojení tabulek pomocí konstrukce MySQL – Join, všimnete si rozdílu v datech, která jsou na výstupu. Takovým mechanismem je levý konstrukt.

    Použití konstruktu MySQL Left Join má některé zvláštnosti a stejně jako Inner vyžaduje jasné pochopení výsledku, kterého je třeba dosáhnout.

    V v tomto případě Nejprve budou vybrány všechny záznamy z první tabulky a později k nim budou připojeny záznamy z druhé tabulky vlastností. Navíc, pokud má první tabulka záznam, například „stolička“, a druhá tabulka pro ni nemá jedinou vlastnost, pak operátor Left vypíše naproti tomuto záznamu nulová hodnota, který programátorovi říká, že pro tento typ položky neexistují žádné znaky.

    Použití tohoto designu vám umožní určit, která pole nebo například produkty v obchodě nejsou naceněny a tak dále.

    Levý příklad

    K praktickému zvážení konstrukčního operátoru Left Join MySQL použijeme dříve popsané tabulky. Řekněme, že potřebujete vybrat celý seznam produktů, které jsou v obchodě, a zkontrolovat, které z nich nemají znaky nebo vlastnosti. V tomto případě se ve výběru zobrazí všechny produkty a ty, které nemají vlastnost, budou mít prázdné hodnoty.

    Použití Where v klauzuli o spojení

    Jako parametr může spojení obsahovat nejen indikace polí, pomocí kterých je třeba propojit tabulky, ale může také zahrnovat operátor podmínky Where.

    Uvažujme například skript, který by nám měl vracet pouze ty záznamy, u kterých není zadán atribut. V tomto případě musíte do konstrukce spojení přidat operátor podmínky a uvést, co přesně je jako výsledek potřeba vrátit.

    Při použití Join - Where v MySQL musíte jasně pochopit, že se zobrazí pouze ty záznamy, na které se vztahuje zadaná podmínka, a výběr pak bude vypadat takto:

    Takové dotazy umožňují provádět výběry na základě konkrétních dat, která se týkají stavu vybraného programátorem. Můžete zadat několik takových podmínek a zároveň maximalizovat parametry pro výběr dat ze sloučených tabulek.

    Pomocí Join můžete změnit data v tabulkách

    Konstrukce Join je v podstatě univerzální. Umožňuje nejen provádět různé výběry, ale také připojit jednu až několik tabulek k dotazům, enter dodatečné podmínky do vzorku. Konstrukce může být také použita pro jiné datové operace. Join tedy lze použít ke změně dat v tabulce. Nebo spíše pro upřesnění podmínek v tabulce nebo v případech, kdy potřebujete aktualizovat data ve více tabulkách podle stejných podmínek.

    Zvažte například následující problém. Jsou uvedeny tři tabulky, které obsahují některá data. Musíte změnit data v obou tabulkách pomocí jednoho dotazu. Právě k vyřešení tohoto druhu úlohy můžete použít konstrukci Join v příkazu Update. Samotný typ konstrukce Join závisí, stejně jako v případě vzorkování dat, na výsledku, kterého chce programátor získat.

    Podívejme se na nejjednodušší příklad. Musíte aktualizovat data pomocí stejných podmínek s jedním požadavkem. Tyto druhy dotazů jsou vytvořeny pro optimalizaci práce s databází. Proč psát různé dotazy pro každou tabulku, když můžete všechny manipulace s daty provádět jedním dotazem? Příklad spojení v našem případě bude vypadat takto:

    Stavební složité dotazy

    Poměrně často je při práci s databází nutné vytvářet dotazy nejen spojením více tabulek, ale také pomocí poddotazů. Takové úlohy jsou pro začínajícího databázového programátora poměrně obtížné pochopit. Potíž je v tom, že si musíte každý krok promyslet, určit, jaká data je třeba z které tabulky nebo dotazu získat a jak s nimi budete muset v budoucnu pracovat.

    Pro přesnější pochopení můžete zvážit (v MySQL Join) příklady složitých dotazů. Pokud jste začátečník a teprve začínáte pracovat s databázemi, pak bude takové školení jedině přínosné. Ideální varianta by byla

    Tento dotaz vrátí 58 záznamů prodejních smluv, pro které je zůstatek vyplněn nebo existuje hotovost k vybranému datu. V tomto případě ano aktuální datum. Do výběru byla také přidána podmínka, že název smlouvy musí obsahovat symboly „123“. Informace (data) zobrazené na obrazovce budou seřazeny - seřazené podle čísla smlouvy.

    Následující příklad zobrazí údaje o všech platbách, na kterých bude uvedeno číslo smlouvy.

    Pomocí poddotazů

    Jak již bylo zmíněno dříve, při práci s databázemi můžete spojit nejen tabulky, ale také tabulku s dotazem. Tento design slouží především k urychlení dotazu a jeho optimalizaci.

    Pokud například potřebujete vybrat pouze dvě pole z tabulky, která má několik set polí a řekněme tisíc záznamů, měli byste použít dotaz, který vrátí pouze povinná pole a zkombinujte jej s hlavním vzorkem dat. Jako příklad MySQL Join Select můžete zvážit dotaz tohoto typu:

    Toto nejsou všechny způsoby, jak používat standardní konstrukce MySQL, pouze ty standardní. Jak používat konstrukci Join a v jakých typech se rozhodne programátor, ale stojí za to si pamatovat a vzít v úvahu, jaký druh výsledku by měl být získán při provádění dotazu.

    Důvodem napsání tohoto článku byla debata v jedné z linkedin skupin související s MySQL a také komunikace s kolegy a lidmi z Habro :-)

    V tomto článku jsem chtěl napsat, co jsou JOINy ​​v MySQL obecně a jak s nimi můžete optimalizovat dotazy.

    Co jsou JOINy ​​v MySQL

    V MySQL se termín JOIN používá mnohem šířeji, než byste si mysleli. Zde může být JOIN nazýván nejen dotazem, který kombinuje výsledky z více tabulek, ale také dotazem do jedné tabulky, například SELECT na jedné tabulce je také spojením.

    Důvodem je to, že algoritmus provádění spojení v MySQL je implementován pomocí vnořených smyček. Tito. Každý následující JOIN je další vnořená smyčka. Pro provedení dotazu a vrácení všech záznamů, které splňují podmínku, provede MySQL smyčku a paralelně prochází záznamy první tabulky, přičemž kontroluje shodu s podmínkami popsanými v těle požadavku, když jsou nalezeny záznamy, které splňují podmínek, vnořená smyčka přes druhou tabulku hledá záznamy, které odpovídají první a splňují podmínky kontroly atd. .d.

    Příklad běžného dotazu s INNER JOIN

    VYBRAT
    *
    Z
    Tabulka1
    VNITŘNÍ SPOJENÍ
    Tabulka2 ON P1(Tabulka1,Tabulka2)
    VNITŘNÍ SPOJENÍ
    Tabulka 3 ON P2 (Tabulka 2, Tabulka 3)
    KDE
    P(Tabulka1,Tabulka2,Tabulka3).

    Kde P - podmínky pro slučování tabulek a filtrů v podmínce WHERE.

    Můžete si představit následující pseudokód pro provedení takového požadavku.

    PRO každéhořádek t1 v tabulce 1 (
    IF(P(t1)) (
    PRO každý řádek t2 v tabulce 2 (
    IF(P(t2)) (
    PRO každý řádek t3 v tabulce 3 (
    IF P(t3) (
    t:=t1||t2||t3; VÝSTUP t;
    }
    }
    }
    }
    }
    }

    * Tento zdrojový kód byl zvýrazněn pomocí Zvýrazňovače zdrojového kódu.

    Kde konstrukce t1||t2||t3 znamená zřetězení sloupců z různých tabulek.

    Pokud dotaz obsahuje OUTER JOIN, například LEFT OUTER JOIN

    VYBRAT
    *
    Z
    Tabulka1
    PŘIPOJIT SE VLEVO
    Tabulka 2 VLEVO PŘIPOJIT Tabulka 3 NA P2 (Tabulka 2, Tabulka 3)
    ON P1(Tabulka1,Tabulka2)
    KDE
    P(Tabulka1,Tabulka2,Tabulka3)

    * Tento zdrojový kód byl zvýrazněn pomocí Zvýrazňovače zdrojového kódu.

    Pak algoritmus, jak to udělat MySQL dotaz bude to vypadat nějak takto

    PRO každý řádek t1 v T1 (
    BOOL f1:=NEPRAVDA;
    PRO každý řádek t2 v T2 tak, že P1(t1,t2) (
    BOOL f2:=NEPRAVDA;
    PRO každý řádek t3 v T3 tak, že P2(t2,t3) (
    IF P(t1,t2,t3) (
    t:=t1||t2||t3; VÝSTUP t;
    }
    f2=PRAVDA;
    f1=PRAVDA;
    }
    POKUD (!f2) (
    IF P(t1,t2,NULL) (
    t:=t1||t2||NULL; VÝSTUP t;
    }
    f1=PRAVDA;
    }
    }
    POKUD (!f1) (
    IF P(t1,NULL,NULL) (
    t:=t1||NULL||NULL; VÝSTUP t;
    }
    }
    }

    * Tento zdrojový kód byl zvýrazněn pomocí Zvýrazňovače zdrojového kódu.

    Jak tedy vidíme, JOINy ​​jsou pouze skupinou vnořených smyček. Proč se tedy v MySQL připojují také UNION a SELECT a dotazy s SUBQUERY?

    Optimalizátor MySQL se snaží přivést dotazy do podoby, ve které je pro něj pohodlnější zpracovávat a provádět dotazy podle standardního schématu.

    S SELECT je vše jasné - jen smyčka bez vnořených smyček. Všechny UNIONy jsou prováděny jako individuální požadavky a výsledky se přidají do dočasné tabulky a s touto tabulkou pak MySQL pracuje, tzn. procházení záznamů v něm. Je to stejný příběh s Subquery.

    Například přenesením všeho do jedné šablony MySQL přepíše všechny dotazy RIGHT JOIN na ekvivalenty LEFT JOIN.

    Ale strategie provádění dotazů prostřednictvím vnořených smyček ukládá určitá omezení, například kvůli tomuto schématu MySQL nepodporuje provádění dotazů FULL OUTER JOIN.

    Ale výsledek takového dotazu lze získat pomocí UNION dvou dotazů na LEFT JOIN a na RIGHT JOIN
    Příklad samotného požadavku si můžete prohlédnout na odkazu wiki.

    PŘIPOJTE SE k plánu provádění dotazů

    Na rozdíl od jiných RDBMS MySQL negeneruje bajtový kód pro provedení dotazu, místo toho MySQL generuje seznam příkazů ve stromové podobě, které se při provádění dotazu řídí motor pro provádění dotazu.
    Tento strom má další pohled a má název „levý-hluboký strom“

    Na rozdíl od vyvážených stromů (Bushy plán), které se používají v jiných DBMS (například Oracle)

    Optimalizace JOIN

    Nyní přejděme k nejzajímavější části – optimalizaci spojování.
    Optimalizátor MySQL, konkrétně část, která je zodpovědná za optimalizaci JOINů, vybírá pořadí, ve kterém budou sloučeny existující tabulky, protože můžete získat stejný výsledek (datovou sadu), když v jiném pořadí tabulky v lepení. Optimalizátor MySQL vyhodnotí náklady různých plánů a vybere ten s nejnižšími náklady. Jednotkou vyhodnocení je operace jednoho čtení 4 kilobajtové stránky dat z náhodného umístění na disku.

    Pro vybraný plán můžete zjistit cenu provedením příkazu

    ZOBRAZIT STAV RElace, JAKO "Náklady_posledního_dotazu";

    Odhad je založen na statistice: počtu paměťových stránek obsazených tabulkou a/nebo indexy pro tuto tabulku, mohutnost (počet jedinečných hodnot) indexů, délka záznamů a indexů, jejich rozložení atd. Při svém vyhodnocování optimalizátor nepředpokládá, že nějaké části skončí v mezipaměti, optimalizátor předpokládá, že každá operace čtení je přístupem na disk.

    Někdy analyzátor-optimalizátor nemůže analyzovat všechny možné plány provádění a vybere ten špatný. Například, pokud máme INNER JOIN na 3 stolech, tak možné možnosti analyzátor má 3! = 6, a pokud slučujeme 10 tabulek, pak je již 10 možných možností! = 3628800... MySQL nedokáže analyzovat tolik možností, takže v tomto případě používá chamtivý vyhledávací algoritmus.

    Ale neměli byste tento hack aplikovat na všechny dotazy a doufat, že optimalizujete shody a ušetříte čas při sestavování plánu provádění dotazů s optimalizátorem a přidávání STRAIGH_JOIN ke všem dotazům s připojením, protože Změny a slučování dat, které je nyní optimální, mohou časem přestat být optimální a dotazy se pak začnou velmi zpožďovat.

    Také, jak již bylo zmíněno výše, výsledky spojení se umisťují do dočasných tabulek, proto je často vhodné použít „odvozenou tabulku“, ve které si na výběr klademe všechny podmínky, které potřebujeme, a také specifikujeme LIMIT a pořadí řazení. V tomto případě se zbavíme redundance dat v dočasné tabulce a také seřadíme podle rané fázi(na základě výsledku jednoho vzorku, nikoli konečného slepení, které zmenší velikost záznamů, které se budou třídit).

    Standardní příklad výše popsaného přístupu. Jednoduchý výběr pro vztah mnoho k mnoha: novinky a štítky k němu.

    VYBRAT
    t.tid, t.description, n.nid, n.title, n.extract , n.modtime
    Z
    VYBRAT
    n.nid
    Z
    novinky n
    KDE
    n. typ = 1321
    AND n.publikováno = 1
    Stav AND = 1
    OBJEDNAT PODLE
    n.modtime DESC
    OMEZIT
    200
    ) jako novinky
    VNITŘNÍ SPOJENÍ
    novinky n ON n.nid = novinky.nid
    VNITŘNÍ SPOJENÍ
    news_tag nt ON n.nid = nt.nid
    VNITŘNÍ SPOJENÍ
    tagy t ON nt.tid = t.tid

    * Tento zdrojový kód byl zvýrazněn pomocí Zvýrazňovače zdrojového kódu.

    A na závěr malý problém, na který se občas při pohovorech ptám :-)

    Existuje zpravodajský blogovací web. Existují takové entity, jako jsou zprávy a komentáře k nim.

    Úkol - musíte napsat dotaz, který zobrazí seznam 10 novinek určitý typ(nastaveno uživatelem) publikace seřazené podle času v chronologickém pořadí a také zobrazit maximálně 10 posledních komentářů pro každou z těchto novinek, tzn. pokud je více komentářů, zobrazíme pouze posledních 10.

    Vše je potřeba udělat v jedné žádosti. Ano, to nemusí být nejvíc nejlepší způsob a můžete navrhnout jiné řešení :-)

    Štítky: Přidat štítky



    
    Nahoru