MySQL Performancefrage LEFT JOIN oder nur WHERE

ZENeca

Grünschnabel
Hallo allerseits,

ich habe hier zwei Abfragen die zum gleichen Ergebnis führen und frage mich welche wohl die bessere Wahl wäre
bzw. ob die vielleicht anderweitig einen Vor- bzw Nachteil haben
oder vielleicht zu irgend welchen Problemen führen die ich gar nicht absehe

also:
hier erst mal die klassische Variante:
Code:
SELECT ......
FROM WARENKORB AS wk
LEFT JOIN KK_TRADE_DB AS tdb ON tdb.id = wk.tiid
WHERE tdb.id = 595
...und die ist vielleicht ein bisschen unorthodox
Code:
SELECT .....
FROM KK_TRADE_DB AS tdb, WARENKORB AS wk
WHERE tdb.id = 595 AND wk.tiid = 595

bin gespannt auf Hinweise

merci

Zen
 
Versuche beide aus und schaue dir den Explain Plan an. Da siehst du dann welches komplizierter ist und ob die Indexe greiffen
 
hm, Explain Statement kannte ich nicht, lieben Dank für's füllen dieser Bildungslücke ♥
und klar, hab's gleich ausprobiert und das Ergebinis ist identisch

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEtdbconstPRIMARYPRIMARY8const1
1SIMPLEwkALL NULL NULL NULL NULL83Using where

eher die Frage, ob man das tiid auch irgendwie indizieren kann
 
Die Frage habe ich mir auch schon oft gestellt. Die zweite Variante ist nicht nur unorthodox sondern auch viel einfacher und besser lesbar. Für mich, der ich nur ein gelegentlicher Nutzer von SQL bin, ein großer Vorteil. Unabhängig von Fragen der Performance, gibt es irgend welche verdeckten Nachteile, wenn man diese verwendet?
 
Ich finde die erste SQL mitm JOIN leserlicher ^^

Ansonsten beim ersten, der LEFT JOIN,
liefert alle ergebnisse WARENKORB und dazu option ergebnisse von KK_TRADE_DB, wenn es dort treffer gibt.

Beim 2ten würde ich eher meinen das es wie ein INNER JOIN ist, sprich es kommen von WARENKORB nur die ergebnisse zu denen es auch KK_TRADE_DB gibt

bei den beispielen wird jetzt nur eine Id abgefragt, aber bleibt das so oder ist das nur ein exemplarisches beispiel, erst dann könnte man genauer urteilen.
(und wie gesagt SQL 1 liefert auch einen wert wenn WARENKORB existiert aber nicht KK_TRADE_DB)

Persönlich finde ich JOINs schöner zu lesen.

Nachtrag,
ah sry grad gesehen im SQL 1 wird im WHERE tdb.id = 595 abgefragt, hätte da wk.tiid erwartet.
Im Grunde könnt man SQL 1 auf INNER JOIN umstellen.
 
1) SQL1 zeigt eindeutig, wer Master und wer Detail ist für DIESE Abfrage. SQL2 muss man raten
2) Spyke liegt richtig. Ein "Warenkorb" impliziert Produkte, welche bereits existieren müssen.
Ergo: Das ist ein INNER JOIN, insbesondere da im WHERE-Abschnitt auf ein Attribut des JOIN's hart gefiltert wird

3) Abhängig von WELCHE Felder im SELECT angezeigt werden, kann man auch argumentieren, dass KK_TRADE_DB eigentlich in den FROM gehört, und der Warenkorb in den JOIN, insbesondere da im WHERE nach einem Attribut von KK_TRADE_DB gefiltert wird
4) Sofern das DBMS es unterstützt, kann man durchaus auch auf einen ForeignKey (oder auf egal welche Felder solange es Sinn ergibt) einen Index erzeugen
 
Zurück