LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> MySQL (22) - tipy a triky ke spojování tabulek

Netradiční zápisy spojení a úvaha nad rychlostí spojování tabulek - to je téma dnešního dílu seriálu o MySQL.

27.5.2005 09:00 | Petr Zajíc | Články autora | přečteno 61410×

Komerční sdělení: Pořádáme Kurzy MySQL

Dnes si rozebereme některé věci, které se týkají spojování tabulek a které byste měli znát. Nebo takové, o nichž byste měli alespoň tušit, že existují. Spojování tabulek je totiž tak v databázovém světě tak důležité, že se bez něj v naprosté většině aplikací zkrátka neobejdete.

Exotická spojení

Na těchto typech spojení je exotické to, že je většina vývojářů nebo projektů téměř nepoužívají. Na jednu stranu se nepoužívají proto, že k tomu není důvod, na druhou stranu je dobré o nich vědět. Takže, která spojení to jsou?

CROSS JOIN

CROSS JOIN spojí tabulky tak, že výsledkem je jejich kartézský součin. To znamená, že pro každý řádek z jedné tabulky je ve výsledné sadě záznamů vytvořena kombinace se všemi řádky z tabulky druhé. Má-li tedy první tabulka 5 řádků a druhá 2 řadky, bude ve výsledné množině řádků deset. CROSS JOIN tabulky knih a druhů bychom mohli zapsat takto:

select * from knihy cross join druhy;

Třebaže se to nezdá, s tímto příkazem jsme se již v seriálu setkali, a to v jiné formě v díle o základech spojování. On je totiž předchozí příklad ekvivalentní zápisu

select * from knihy, druhy;

a abychom byli politicky korektní, je rovněž významem roven zápisu

select * from knihy join druhy;

Sady vrácené pomocí CROSS JOIN bývají málokdy tak smysluplné, aby je šlo v reálných aplikacích nějak použít. Typickou chybou pro začátečníky v oblasti spojování tabulek je vytvoření příkazu CROSS JOIN a následné "vyzobávání" potřebných záznamů pomocí klauzule WHERE nebo pomocí procházení výsledné sady záznamů. V praxi bývá většinou na místě použití INNER JOIN nebo LEFT JOIN.

Jako obecná zásada tedy může sloužit tvrzení, že používáte-li CROSS JOIN, pak nejspíš máte pomalé databázové aplikace, špatný návrh struktury databáze nebo obojí.

NATURAL JOIN

Takže, nejprve definice: NATURAL JOIN (a NATURAL LEFT JOIN) je roven takovému příkazu JOIN (a LEFT JOIN), kde jsou použity všechny sloupce z obou tabulek, které se stejně jmenují. Tahle věcička patří k těm, které se rozhodnete milovat nebo nenávidě, ale nic mezi tím. NATURAL JOIN se pochopitelně dá vždy přepsat jako odpovídající JOIN. Uveďme ale příklad, jak by takové spojení mohlo vypadat:

select * from knihy natural join druhy;

Pokud si to zkoušíte, zjistíte, že tento dotaz nevrátí pro naše tabulky žádná data. Proč? Podívejte se na strukturu tabulek! Která pole se jmenují stejně? ID a název - a neexistuje záznam, v němž by byly v našem příkladu shodné. Přiznám se, že patřím k těm, kdo NATURAL JOIN moc v lásce nemají. Pokud byste chtěli vědět proč, tady jsou moje důvody:

  • Z pohledu na zápis spojení pomocí NATURAL JOIN nepoznám, co dělá
  • Již fungující příkaz mohu elegantně zbořit tím, že do tabulky někdy v budoucnosti přidám nějaká pole (které bude shodou okolností existovat i v druhé tabulce)
  • Nevyhovuje to mým konvencím pro tvorbu tabulek. Například všechny primární klíče pojmenovávám id, a tím se vlastně ochuzuji o možnost NATURAL JOIN použít

Pozn.: Ten poslední bod je samozřejmě vyvratitelný. Nic by mi nebránilo nazvat si v tabulce druhů sloupec s primárním klíčem třebas druh_id. Kdybych pak v tabulce knih rovněž odkazující sloupec nazval druh_id, NATURAL JOIN by se dal použít a určitá koncepce pojmenování tabulek by taky zůstala. Nicméně, zvyk je železná košile.

Uvědomme si, že NATURAL JOIN použije pro spojení všechna shodná pole. O něco elegantnější je následující konstrukce.

JOIN ... USING

Toto rozšíření funguje tak, že sice rovněž spojuje pomocí shodně nazvaných polí v obou tabulkách, ale umožňuje nám tato pole vyjmenovat. Kdybychom v našem příkladu měli skutečně pole zastupující žánr knihy nazváno druh_id, mohli bychom příkaz

select * from knihy join druhy on knihy.druh_id = druhy.druh_id;

přepsat použitím JOIN ... USING na

select * from knihy join druhy using (druh_id);

Jak vidíte, tím padají všechny moje argumenty ohledně nepoužitelnosti NATURAL JOIN, protože tento zápis spojení je celkem přehledný a dá se použít. Nicméně, stále to vyžaduje mít odpovídající pole ve spojovaných tabulkách nazvána stejně. Pochopitelně, že lze rovněž použít zápis LEFT JOIN ... USING a RIGHT JOIN ... USING.

Rychlost spojení

Zaznamenal jsem některé dotazy v diskusi nebo e-mailech, které souvisely s výkonem spojení. Pokusím se teď na ně odpovědět.

Je rozdíl mezi LEFT JOIN a RIGHT JOIN v rychlosti?

Ne, manuál k mysql na stránce o optimalizaci spojení tvrdí, že "RIGHT JOIN je imlementováno analogicky k LEFT JOIN s tím, že role obou tabulek jsou prohozeny". Nemusíte se tedy bát. Skutečně není nutné vyměňovat v zápisu spojení tabulky jen proto, abychom dosáhli zvýšení rychlosti.

Musím spojit více tabulek. Nebude to pomalé?

V naprosté většině případů bude spojení více tabulek stejně to nejrychlejší možné řešení. Ostatní možnosti (například, uložení jednoho spojení do dočasné tabulky a její použití při dalším spojení) budou až řádově pomalejší.

Čeho bych se měl vyvarovat při spojování tabulek? Co naopak použít?

První věcí, kterou je třeba zmínit jsou indexy. V seriálu o nich bude teprve řeč, takže vydržte. Měli byste zvážit použití indexu pro spojení, protože toto spojení pak může být mnohem rychlejší. Druhá věc - a tu můžeme uvést hned - měli byste se pokud možno vyhýbat použití čehokoli jiného kromě názvu sloupců v definici spojení. Například následující spojení je sice syntakticky správné a MySQL jej provede.

select * from zamestnanec join pozice on zamestnanec.pozice = pozice.id+3;

Protože však je součástí spojovací podmínky výraz (pozice.id+3), nemůže nebohá databáze provést žádnou optimalizaci a bude zřejmě při sestavování spojení muset procházet tabulkou "pozice".

Verze pro tisk

pridej.cz

 

DISKUZE

LeftJoin a rychlost 29.6.2005 15:55 gudnet
jaa 5.4.2011 12:07 jja a jj




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

13.9.2017 8:00 /František Kučera

Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt – tentokrát netradičně v pondělí: 18. září od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).


Přidat komentář

3.9.2017 20:45 /Redakce Linuxsoft.cz
PR: Dne 21. září 2017 proběhne v Praze konference "Mobilní řešení pro business". Hlavní tématy konference budou: nejnovější trendy v oblasti mobilních řešení pro firmy, efektivní využití mobilních zařízení, bezpečnostní rizika a řešení pro jejich omezení, správa mobilních zařízení ve firmách a další.
Přidat komentář

15.5.2017 23:50 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 18. května od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

12.5.2017 16:42 /Honza Javorek
PyCon CZ, česká konference o programovacím jazyce Python, se po dvou úspěšných ročnících v Brně bude letos konat v Praze, a to 8. až 10. června. Na konferenci letos zavítá např. i Armin Ronacher, známý především jako autor frameworku Flask, šablon Jinja2/Twig, a dalších projektů. Těšit se můžete na přednášky o datové analytice, tvorbě webu, testování, tvorbě API, učení a mentorování programování, přednášky o rozvoji komunity, o použití Pythonu ve vědě nebo k ovládání nejrůznějších zařízení (MicroPython). Na vlastní prsty si můžete na workshopech vyzkoušet postavit Pythonem ovládaného robota, naučit se učit šestileté děti programovat, efektivně testovat nebo si v Pythonu pohrát s kartografickým materiálem. Kupujte lístky, dokud jsou.
Přidat komentář

2.5.2017 9:20 /Eva Rázgová
Putovní konference československé Drupal komunity "DrupalCamp Československo" se tentokrát koná 27. 5.2017 na VUT FIT v Brně. Můžete načerpat a vyměnit si zkušenosti z oblasti Drupalu 7 a 8, UX, SEO, managementu týmového vývoje, využití Dockeru pro Drupal a dalších. Vítáni jsou nováčci i experti. Akci pořádají Slovenská Drupal Asociácia a česká Asociace pro Drupal. Registrace na webu .
Přidat komentář

1.5.2017 20:31 /Pavel `Goldenfish' Kysilka
PR: 25.5.2017 proběhne v Praze konference na téma Firemní informační systémy. Hlavními tématy jsou: Informační systémy s vlastní inteligencí, efektivní práce s dokumenty, mobilní přístup k datům nebo využívání cloudu.
Přidat komentář

15.4.2017 15:20 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě IoT a radiokomunikace? Přijď na sraz spolku OpenAlt, který se bude konat ve středu 19. dubna od 18:30 v Šenkovně (Sokolská 60, Praha 2).
Přidat komentář

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

18.9.2017 14:37 / Rojas
high security vault

15.9.2017 7:33 / Wilson
new zealand childcare jobs

31.8.2017 12:11 / Jaromir Obr
Re: ukůládání dat ze souboru

30.7.2017 11:12 / Jaromir Obr
Národní znaky

27.7.2017 12:24 / Jaromir Obr
Cteni/zapis

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze