- Inner Join: innere Verbindung (äquivalente Verbindung)
- linker Beitritt: linker Beitritt
- rechter Beitritt: richtiger Beitritt
- Kreuzverknüpfung: Kreuzverbindung
Beispiel: Angenommen, es gibt zwei Tabellen wie folgt
Inner Join und Cross Join
Die folgenden Anweisungen haben die gleiche Ausgabe
select
user.name,
user.age,
depart.department
from
user
inner join
depart
on
user.name = depart.name
select
user.name,
user.age,
depart.department
from
user
cross join
depart
on
user.name = depart.name
- Die Ausgabeergebnisse sind die gleichen. Die Verwendung von Cross-Join und Inner-Join ist dieselbe, nehmen Sie den Schnittpunkt
- Das Ergebnis ist das gleiche, wenn inner/cross weggelassen wird
- Wenn die Ein-Bedingung nicht hinzugefügt wird, sind das Ergebnis zwei markierte „kartesische Mengen“ wie folgt
links beitreten
Der linke Join ruft alle Datensätze in der linken Tabelle ab. Wenn in der rechten Tabelle kein übereinstimmender Datensatz vorhanden ist, wird er durch null ersetzt
- Tabellenverknüpfungen müssen mit dem Schlüsselwort on erstellt werden
rechts beitreten
Der rechte Join ruft alle Datensätze in der rechten Tabelle ab. Wenn in der linken Tabelle kein übereinstimmender Datensatz vorhanden ist, wird dieser durch null ersetzt
- Tabellenverknüpfungen müssen mit dem Schlüsselwort on eingerichtet werden
So erstellen Sie einen Index für die Join-Anweisung
Verstehen Sie zunächst das Konzept der „Laufwerkstabelle“.
Nehmen Sie das folgende SQL als Beispiel
select user.name,user.age,depart.department
from user
left join depart
on user.name = depart.name
在以上SQL中,查询的主表是user,然后根据on条件去depart表中查询。如果存在相同的name,那么进行数据组合,反之用null代替。
In diesem Beispiel ist die treibende Tabelle „user“, also die Tabelle, die die Abfrage aktiv initiiert, und die getriebene Tabelle „depart“ , also die Tabelle, die entsprechend der Ein-Bedingung abgefragt wird.
Der MySQL-Optimierer verfügt über einen Auswahlprozess für die Treibertabelle, und das Schlüsselwort straight_join
kann zum Korrigieren der Treibertabelle verwendet werden. folgendermaßen
select user.name,user.age,depart.department
from user
straight_join depart
on user.name = depart.name
straight_join 使用效果和 left join相同,但是其可以帮助固定驱动表。
Wenn das Schlüsselwort „straight_join“ nicht verwendet wird, wird die Treibertabelle gemäß dem MySQL-Optimierer ausgewählt, nämlich:
- Wenn die Verbindungsbedingung angegeben ist, wählen Sie als Treibertabelle eine Tabelle mit einer kleinen Anzahl von Zeilen aus, die die Abfragebedingung erfüllt
- Wenn keine Join-Bedingung angegeben ist, scannen Sie die Tabelle mit einer kleinen Anzahl von Zeilen als treibende Tabelle
Das heißt, der MySQL-Optimierer wählt den Treiber basierend auf kleinen Tabellen aus, die große Tabellen steuern
Unter der Annahme, dass Tabelle A 100 Datensätze und Tabelle B 10.000 Datensätze enthält, gibt es die folgende SQL
select * from A join B on A.name = B.name
Indizieren Sie einen Nested-Loop-Join
Wenn ein Index für den Feldnamen der gesteuerten Tabelle B erstellt wird
- Lesen Sie eine Datenzeile aus Tabelle A in R
- Nehmen Sie aus der Datenzeile R das ID-Feld zum Namensindexbaum von Tabelle B heraus, um den entsprechenden Primärschlüssel zu suchen und zu finden
- Fragen Sie dann die Tabelle gemäß dem Primärschlüssel ab, entfernen Sie alle Zeilen, die die Bedingungen in Tabelle B erfüllen, und bilden Sie dann eine Zeile mit Zeile R als Teil der Ergebnismenge
- Diese Art von Index, der den gesteuerten Tabellenabgang verwendet – Index Nested-Loop Join (kurz NLJ)
- Zeitkomplexität 100 + 100 = 200 Zeilen
Einfacher Nested-Loop-Join
Wenn es keinen Index für den Feldnamen der gesteuerten Tabelle B gibt
, ist die Anzahl der Datenzeilen in der gesteuerten Tabelle A nach der SQL-Optimierung durch den MySQL-Optimierer gering und wird als Treibertabelle verwendet. Dann ist seine Abfragereihenfolge
- Lesen Sie zunächst alle Daten in Tabelle A, fragen Sie die Daten in der Treibertabelle ab und legen Sie sie in den Join-Puffer
- Die Bedingung für das Einfügen von Daten in den Join-Puffer lautet: Typ = ALL/INDEX. In anderen Fällen ist die Abfrageeffizienz höher und es besteht keine Notwendigkeit, die Daten in den Join-Puffer zu legen
- Rufen Sie dann das Namensdatenelement aus den gelesenen A-Tabellendaten ab und scannen Sie dann die B-Tabelle, um das passende Element zu erhalten – kurz SNL
- Das endgültige Ausgabeergebnis – seine zeitliche Komplexität beträgt 10 ∗ 10000 = 1 0 6 10*10000=10^610∗10000=1 06
Nested-Loop-Join blockieren
BNL
- Lesen Sie die Daten in Tabelle A und legen Sie sie in den Join-Puffer
- Scannen Sie die B-Tabelle, entnehmen Sie jede Datenzeile in der B-Tabelle, vergleichen Sie sie mit den Daten im Join-Puffer und geben Sie sie als Ergebnismenge zurück, wenn sie die Ein-Bedingung erfüllt.
- Tun Sie dies im Speicher, relativ schneller als SNL
- Wenn die gleichzeitig abgefragten Daten größer sind
join_buffer_size
, werden sie in Blöcken zusammengefügt