MySQL: Welcher Join ist besser zwischen linkem äußeren Join und innerem Join?

10

Welcher Join ist besser geeignet, wenn alle das gleiche Ergebnis liefern? Zum Beispiel habe ich zwei Tabellen employees(emp_id,name, address, designation, age, sex)und work_log(emp_id,date,hours_wored). Um einige konkrete Ergebnisse zu bekommen beide inner joinund left joingibt das gleiche Ergebnis. Ich habe jedoch noch einige Zweifel, die sich nicht nur auf diese Frage beschränken.

  • Welcher Join ist effizienter, welcher sollte bei gleichen Ergebniswerten bevorzugt werden?
  • Welche anderen Faktoren müssen zum Zeitpunkt der Bewerbung berücksichtigt werden?
  • Gibt es eine Beziehung zwischen innerem Join und Cross-Join?
ursitesion
quelle

Antworten:

14

Es gibt keinen "besseren" oder "schlechteren" Join-Typ. Sie haben unterschiedliche Bedeutungen und müssen abhängig davon verwendet werden.

In Ihrem Fall haben Sie wahrscheinlich keine Mitarbeiter ohne work_log (keine Zeilen in dieser Tabelle), LEFT JOINund JOINdie Ergebnisse sind gleichwertig. Wenn Sie jedoch so etwas hätten (ein neuer Mitarbeiter ohne registriertes work_log), würde ein JOINWold diesen Mitarbeiter weglassen, während ein linker Join (dessen erste Tabelle Mitarbeiter ist) alle anzeigen würde und Nullen in den Feldern von work_log, falls vorhanden sind keine Übereinstimmungen.

Visuelle Erklärung der JOIN-Typen

Auch hier spielt die Leistung eine untergeordnete Rolle bei der Abfrage der Korrektheit. Einige Leute sagen, dass Sie LEFT JOINs nicht verwenden sollten . Es ist richtig, dass ein LEFT JOIN den Optimierer zwingt, die Abfrage in einer bestimmten Reihenfolge auszuführen, wodurch in einigen Fällen einige Optimierungen (Tabellenumordnung) verhindert werden. Hier ist ein Beispiel . Aber Sie sollten nicht eins über das andere wählen, wenn Korrektheit / Bedeutung geopfert wird, da ein INNER JOIN nicht von Natur aus schlechter ist. Die restlichen üblichen Optimierungen gelten wie gewohnt.

Zusammenfassend nicht verwenden, LEFT JOINwenn Sie wirklich meinen INNER JOIN.

In MySQL CROSS JOIN, INNER JOINund JOINsind gleich. Im Standard und semantisch, eine CROSS JOINist eine INNER JOINohne eine ONKlausel, so dass Sie jede Kombination von Zeilen zwischen den Tischen zu bekommen.

Sie haben Beispiele für alle semantischen Join-Typen auf Wikipedia . In der Praxis schreiben wir in MySQL nur JOINund LEFT JOIN.

Jynus
quelle
1
Gr8 Erklärung @jynus. Es ist ein Glück, dass ich diese Frage nur von Ihnen beantwortet habe.
ursitesion
1 relevante Grafik ist besser als 1000 Wörter. Hast du es gemacht?
Fr0zenFyr
Nein, habe ich nicht, Zuschreibung ist am unteren Rand des Bildes codeproject.com/Articles/33052/... - Obwohl die Verwendung von Venn - Diagramme schließt sich darzustellen , ist so alt wie seine algebraische Formalisierung: en.wikipedia.org/wiki/Relational_algebra
Jynus
Ich habe mit einer Reihe von Kommentaren begonnen und dann festgestellt, dass alles darauf hinausläuft - es hängt von Ihrer Anfrage ab. +1 von mir!
Iheanyi
Und der Vollständigkeit halber: In MySQL JOINimpliziert unqualifiziertes SchreibenINNER JOIN
Peter V. Mørch
0

Welcher Join ist leistungsfähiger, wenn alle das gleiche Ergebnis liefern?

Ich füge die vorherige Antwort hinzu, soweit ich weiß, ist MySQL optimiert, um die gleiche Leistung zu erzielen.

Bei guten Indizes ist beispielsweise die zu JOINfilternde vs LEFT JOIN+ WHERE-Klausel dasselbe. Optimierung vs. menschliches Lesen ist bei großen Abfragen mit vielen Verknüpfungen sinnvoll.

Die Verwendung guter Indizes und Caches ist wichtiger.

Eine gute Erklärung des Optimierungsprozesses finden Sie hier:

Der Abfrageoptimierungsprozess : Eine Abfrage kann häufig auf viele verschiedene Arten ausgeführt werden und das gleiche Ergebnis erzielen. Die Aufgabe des Optimierers besteht darin, die beste Option zu finden.

Shim-Sao
quelle