/ / Kde je lepšie uviesť podmienky „do“ pri viacerých spojeniach? (mysql) - mysql, join, on-clause

Kde je lepšie dať "on" podmienky v niekoľkých spojeniach? (mysql) - mysql, join, on-clause

Mám viacnásobné pripojenia, vrátane ľavých spojení v mysql. Existujú dva spôsoby, ako to urobiť.

  1. Podmienky „ZAPNUTÉ“ môžem uviesť hneď po každom pripojení:

    vyberte * z A pripojenie B ZAPNUTÉ (A.bid = B.ID) pripojenie C ZAPNUTÉ (B.cid = C.ID) pripojenie D ZAPNUTÉ (c.did = D.ID)

  2. Môžem ich dať všetky do jednej klauzuly „ON“:

    vyberte * z A spojenia B spojenia C spojenia D ZAPNUTÉ (A.bid = B.ID AND B.cid = C.ID AND c.did = D.ID)

Ktorý spôsob je lepší?

Je to iné, ak potrebujem Pripojte sa doľava alebo Pripojte sa správne v mojom dotaze?

odpovede:

5 pre odpoveď č. 1

Pre jednoduché použitie ich MySQL takmer nevyhnutne vykoná rovnakým spôsobom, takže ide o preferenčný a čitateľný spôsob (ktorý je veľkým predmetom diskusií).

Pri zložitejších dotazoch, najmä agregovaných dotazoch s OUTER JOINs, ktoré majú potenciál stať sa viazanými na disk a io - pri nepoužívaní klauzuly WHERE s dotazmi OUTER JOIN môžu existovať implikácie a neviditeľné dôsledky.

Rozdiel medzi dotazom, ktorý trvá 8 minút alebo 0,8 sekundy smieť nakoniec závisí od WHERE doložka, najmä pokiaľ ide o indexy (Ako MySQL používa indexy): The WHERE doložka je kľúčovou súčasťou poskytovania optimalizácie dotazu informácií potrebných na jej vykonanie a informovania motora, ako vykonať dotaz najefektívnejším spôsobom.

z Ako MySQL optimalizuje dotazy pomocou WHERE:

„Táto časť pojednáva o optimalizáciách, ktoré môžu byťvyrobené na spracovanie Klauzuly WHERE ... Najlepšia kombinácia spojení pre spájanie tabuliek je nájdené vyskúšaním všetkých možností. Ak sú všetky stĺpce v ORDER BY a Klauzuly GROUP BY pochádzajú z tej istej tabuľky, táto tabuľka je preferovaná najskôr pri pripojení. “

Pre každú tabuľku v spojení je na získanie pôstu skonštruovaná jednoduchšia funkcia WHERE KDE hodnotenie pre tabuľku a tiež čo najskôr preskočiť riadky možné

Niektoré príklady:

Skenovanie celej tabuľky (typ = VŠETKY) s Č Using where EXTRA

[SQL] SELECT cr.id,cr2.role FROM CReportsAL cr
LEFT JOIN CReportsCA cr2
ON cr.id = cr2.id AND cr.role = cr2.role AND cr.util = 1000

[Err] Out of memory

použitie where na optimalizáciu výsledkov s indexom (Using where,Using index):

[SQL] SELECT cr.id,cr2.role FROM CReportsAL cr
LEFT JOIN CReportsCA cr2
ON cr.id = cr2.id
WHERE cr.role = cr2.role
AND cr.util = 1000

515661 rows in set (0.124s)

**** Kombinácia ZAP / KDE - Rovnaký výsledok - Rovnaký plán v EXPLAIN*******

[SQL] SELECT cr.id,cr2.role FROM CReportsAL cr
LEFT JOIN CReportsCA cr2
ON cr.id = cr2.id
AND cr.role = cr2.role
WHERE cr.util = 1000

515661 rows in set (0.121s)

MySQL je zvyčajne dostatočne inteligentný na to, aby zistil jednoduché dotazy, ako je uvedené vyššie, a vykoná ich podobne, ale v určitých prípadoch nie.

Výkon dotazu na vonkajšie pripojenie:

Pretože LEVÝ SPOJ a PRAVÝ SPOJ sú VONKAJŠIE SPOJENIA (Veľké hĺbkové preskúmanie tu) vznikne problém karteziánskeho produktu, musí sa zabrániť vyhýbaniu sa skenovaniu tabuľky, aby sa čo najrýchlejšie vylúčilo čo najviac riadkov, ktoré nie sú potrebné pre dopyt.

WHERE, Indexy a optimalizátor dotazov používaný spoločne smieť úplne eliminovať problémy, ktoré spôsobujú karteziánske výrobky, ak sa používajú opatrne so súhrnnými funkciami ako AVERAGE, GROUP BY, SUM, DISTINCT atď., sa dosahuje rádového zníženia doby behu správnym indexovaním používateľom a využitím klauzuly WHERE.

konečne

Opäť platí, že pre väčšinu dotazov ich optimalizátor dotazov vykoná rovnakým spôsobom - čo z neho urobí preferenčný spôsob, ale keď bude optimalizácia dotazu dôležitá, WHERE je veľmi dôležitý nástroj. V niektorých prípadoch som zaznamenal určité zvýšenie výkonu INNER JOIN zadaním indexovaného stĺpca ako ďalšej klauzuly ON..AND ON, ale nemohol som vám povedať prečo.


3 pre odpoveď č. 2

Dajte klauzulu ON so SPOJENÍM, na ktoré sa vzťahuje.

Dôvody sú:

  • čitateľnosť: ostatní môžu ľahko vidieť, ako sú tabuľky spojené
  • výkon: ak v dotaze ponecháte podmienky neskôr, získate omnoho viac pripojení, ako je potrebné - je to ako vložiť podmienky do klauzuly where
  • konvencia: pri dodržaní bežného štýlu bude váš kód prenosnejší a bude menej pravdepodobné, že narazíte na problémy, ktoré sa môžu vyskytnúť pri neobvyklej syntaxi - robte, čo funguje