Ausführliche Erklärung des Kreuzes, der Innenseite, der linken und rechten Seite von MySQL

  • 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
Bild.png

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

Bild.png

  • 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

Bild.png

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_joinkann 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^61010000=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

Ich denke du magst

Origin blog.csdn.net/GoNewWay/article/details/130749272
Empfohlen
Rangfolge