MySQL: Innerer Join vs Wo [doppelt]

7

Gibt es einen Leistungsunterschied (in mysql) zwischen

? %Vor%

Und

%Vor%

?

    
Victor 11.03.2011, 14:10
quelle

8 Antworten

10

Wie aus der angenommenen Antwort in Frage 44917 hervorgeht:

  

Leistungsmäßig sind sie genau das   Gleiches (zumindest in SQL Server) aber sein   bewusst, dass sie die ablehnen   implizite Outer-Join-Syntax.

In MySql sind die Ergebnisse gleich.

Ich würde persönlich bei der expliziten Verknüpfung von Tabellen bleiben ... das ist der "sozial akzeptable" Weg, dies zu tun.

    
Patrick 11.03.2011, 14:16
quelle
11

Sie sind gleich. Dies wird angezeigt, indem Sie den Befehl EXPLAIN ausführen:

%Vor%     
Ewan Heming 11.03.2011 14:20
quelle
2

Nun, eine späte Antwort von mir, da ich die Leistung einer älteren Anwendung analysiere, die komma-basierte Join anstelle von INNER JOIN -Klausel verwendet.

Also hier sind zwei Tabellen, die einen Join haben (beide haben mehr als 1 Lac Datensätze). Wenn Sie eine Abfrage ausführen, die eine Komma-basierte Verknüpfung hat, dauert es viel länger als die INNER JOIN -Fall.

Beim Analysieren der EXPLAIN-Anweisung habe ich festgestellt, dass die Abfrage mit Komma-Verknüpfung den Join-Puffer verwendet. Die Abfrage mit der INNER JOIN -Klausel hatte jedoch "where verwenden".

Auch diese Abfragen unterscheiden sich erheblich, wie in der Spalte "Zeilen" in der EXPLAIN-Abfrage angezeigt. Dies sind meine Fragen und ihre jeweiligen erklären Ergebnisse.

%Vor%

v / s

%Vor%     
kuldeep.kamboj 04.05.2012 05:15
quelle
1

Eigentlich sind sie praktisch gleich, der JOIN / ON ist neuer ANSI synctac, der WHERE ist eine ältere ANSI Syntax. Beide werden von Abfrage-Engines erkannt

    
DRapp 11.03.2011 14:17
quelle
0

Das Komma in einer FROM-Klausel ist ein CROSS JOIN. Wir können uns vorstellen, dass der SQL-Server eine Prozedur zur Auswahl der Abfrage hat, die irgendwie so aussehen sollte: 1. Iteriere durch jede Tabelle 2. Suchen Sie nach Zeilen, die das Prädikat für Verknüpfungen erfüllen, und fügen Sie sie in die Ergebnistabelle ein. 3. Erhalte aus der Ergebnistabelle nur die Zeilen, die die WHERE-Bedingung erfüllen.

Wenn es wirklich so aussieht, dann könnte die Verwendung eines CROSS JOIN für eine Tabelle mit einigen tausend Zeilen viel Speicher zuweisen, wenn jede Zeile miteinander kombiniert wird, bevor die WHERE-Bedingung geprüft wird. Ihr SQL-Server könnte dann ziemlich beschäftigt sein.

    
Piotr Salaciak 11.03.2011 14:13
quelle
0

Das würde ich mir denken, weil das erste Beispiel mysql explizit mitteilt, welchen Spalten man beitreten soll und wie man sie verbindet, wo die zweite mysql versuchen soll herauszufinden, wo man sich verbinden möchte.

    
Alistair Laing 11.03.2011 14:14
quelle
0

Die zweite Abfrage ist nur eine weitere Notation für einen inneren Join. Wenn es also einen Unterschied in der Porformance gibt, dann nur, weil eine Abfrage schneller geparst werden kann als die andere - und dieser Unterschied, wenn er existiert, wird so klein sein Du wirst es nicht bemerken.

Für weitere Informationen können Sie versuchen, sich diese Frage anzusehen (und die Suche bei SO das nächste Mal verwenden eine Frage stellen, die bereits beantwortet ist)

    
oezi 11.03.2011 14:17
quelle
0

Die erste Abfrage ist für MySQL einfacher zu verstehen, daher ist es wahrscheinlich, dass der Ausführungsplan besser ist und die Abfrage schneller ausgeführt wird.

Die zweite Abfrage ohne die where-Klausel ist ein Cross-Join. Wenn MySQL in der Lage ist, die where-Klausel gut genug zu verstehen, wird sie ihr Bestes tun, um ein Überkreuzen aller Zeilen zu vermeiden, aber nichts garantiert das.

In einem Fall, der so einfach ist wie Ihr, wird die Leistung streng identisch sein.

Im Hinblick auf die Leistung wird die erste Abfrage immer besser oder identisch mit der zweiten sein. Und aus meiner Sicht ist es auch beim Nachlesen viel einfacher zu verstehen.

    
krtek 11.03.2011 14:17
quelle

Tags und Links