Eine kurze Erläuterung des zugrunde liegenden Prinzips von MySQL Join

Eine kurze Erläuterung des zugrunde liegenden Prinzips von MySQL Join

Join-Algorithmus

MySQL unterstützt nur einen Join-Algorithmus: Nested-Loop Join, aber Nested-Loop Join hat drei Varianten:

  • Einfacher Nested-Loop Join, einfache Verschachtelung
  • Index Nested-Loop-Join
  • Block Nested-Loop Join, Join-Pufferverschachtelung (temporäre Tabelle)

Der Unterschied zwischen angetriebenen und nicht angetriebenen Tischen

Die treibende Tabelle ist die Haupttabelle und die nicht getriebene Tabelle ist die untergeordnete Tabelle. Sie können dies sehen, indem Sie sich das folgende SQL ansehen. A ist die treibende Tabelle und B ist die nicht getriebene Tabelle.

Wähle * von A nach links und schließe dich B an

Wenn A mit B verbunden wird, müssen wir dann zuerst Tabelle A und dann Tabelle B überprüfen?

Die Antwort lautet nicht unbedingt, da MySQL einen Optimierer enthält, der basierend auf Ihren Abfrageanweisungen einige Optimierungen vornimmt. Der Optimierer bestimmt auch, welche Tabelle zuerst überprüft werden soll, aber es ist sicher, dass die zuerst überprüfte Tabelle die treibende Tabelle ist und umgekehrt. Was die Frage betrifft, welche Tabelle zuerst überprüft werden soll, können wir das Ergebnis erhalten, indem wir uns den Ausführungsplan ansehen; fügen Sie einfach das Schlüsselwort „explain“ davor hinzu;

erkläre select * from A join B;

1. Einfacher Nested-Loop-Join, einfache Verschachtelung – kein Index

A Left Join B: Jedes Mal wird die gesamte Tabelle abgeglichen. Jede Datenzeile in Tabelle A wird einmal in Tabelle B abgeglichen. Das heißt, wenn Tabelle A 10 Datensätze und Tabelle B 1000 Datensätze enthält, beträgt die Anzahl der Scans während der Abfrage 10*1000, was bedeutet, dass die Abfrage 10000 Mal scannen muss, um die Daten abzurufen.

2. Index Nested-Loop Join-Indexierter Fall

select * from A join B on A.id=B.id where A.id = 1: Bei der Abfrage sucht die Treibertabelle A nach dem Index des zugehörigen Felds. Wenn im Index ein übereinstimmender Wert gefunden wird, wird die Abfrage an die Tabelle zurückgegeben. Mit anderen Worten, die Abfrage wird erst dann an die Tabelle zurückgegeben, wenn der Index übereinstimmt.
Wenn das verknüpfte Feld B.id der nicht gesteuerten Tabelle B der Primärschlüssel ist, ist die Leistung sehr hoch. Wenn es nicht der Primärschlüssel ist, werden mehrere Tabellenabfragen ausgeführt. Zuerst wird der Index verknüpft und dann wird die Tabellenabfrage basierend auf der Primärschlüssel-ID des Sekundärindex ausgeführt. Die Leistung ist langsamer als die des Primärschlüssels.

3. Block Nested-Loop Join, Verbindungspuffer

Wenn ein Index vorhanden ist, wird Index Nested-Loop Join zum Verbinden der Tabellen verwendet. Wenn kein Index für die Verbindungsspalte vorhanden ist, wird Block Nested-Loop Join verwendet. Verbindungspuffer. Zwischen der Treibertabelle und der Nicht-Treibertabelle befindet sich ein Puffer. Bei der Abfrage werden die Daten der Treibertabelle zuerst im Puffer zwischengespeichert und dann stapelweise mit der Nicht-Treibertabelle abgeglichen. Dies ist eine Optimierungslösung, die mehrere Vergleiche zu einem Vergleich zusammenfasst. Hinweis: Hier werden nicht nur die Spalten der zugehörigen Tabelle zwischengespeichert, sondern auch die Spalten nach der Auswahl.

Puffergröße

Standardmäßig beträgt die Kapazität des Puffers join_biffer_size 256 KB. Wenn Ihr Datenspeicherplatz größer als 256 KB ist, kann der Puffer nicht verwendet werden und der Join wird in den einfachsten Simple Nested-Loop Join umgewandelt. Wir können die Puffergröße jedoch manuell anpassen, um große Datenmengen zu laden. Sehen Sie sich die join_biffer_size-SQL an: Variablen wie „%join_biffer_size%“ anzeigen

So wählen Sie die Verbindungsreihenfolge für Tabellen mit großen und kleinen Datenmengen

Am besten verbindet man die kleine Tabelle mit der großen Tabelle, das reduziert die Anzahl der Scans; wenn die große Tabelle beispielsweise 1.000 Datensätze hat und die kleine Tabelle nur 10 Datensätze, dann ist die beste Verbindungsmethode: Die kleine Tabelle verbindet sich mit der großen Tabelle; warum macht man das?

  • Wenn eine große Tabelle mit einer kleinen Tabelle verknüpft ist und sich unsere Daten in Zeile 999 der großen Tabelle befinden, müssen wir sie bei einer Datenabfrage mindestens 999 Mal durchsuchen, um sie zu finden.
  • Wenn eine kleine Tabelle mit einer großen Tabelle verknüpft wird und unsere Daten in Zeile 9 der kleinen Tabelle stehen,

Detail

  • Bei der gemeinsamen Abfrage von Tabellen sollten möglichst nicht mehr als drei Tabellen verwendet werden, da die zu verknüpfenden Felder den gleichen Datentyp aufweisen müssen.
  • Innere Verknüpfungen werden zum Verknüpfen von Tabellen bevorzugt. Äußere Verknüpfungen erfordern bei der Datenabfrage mehr Leistung als innere Verknüpfungen.
  • Stellen Sie sicher, dass die Spalten nach „on“ in der zugehörigen Abfrage oder die Felder in „using()“ Indizes haben, um den Datenzugriff beim Verknüpfen von Tabellen zu beschleunigen.

Dies ist das Ende dieses Artikels über die zugrunde liegenden Prinzipien von MySQL Join. Weitere Informationen zu den zugrunde liegenden Prinzipien von MySQL Join finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Analyse von Anwendungsszenarien von JOIN in SQL-Anweisungen
  • MySQL-Datenbankgrundlagen - Prinzip der Join-Operation
  • So lösen Sie das Problem des ungültigen linken Joins in MySQL und die Vorsichtsmaßnahmen bei seiner Verwendung
  • Der Prozess der schnellen Konvertierung eines MySQL-Left-Joins in einen Inner-Join
  • Warum erfordern Codestandards, dass SQL-Anweisungen nicht zu viele Verknüpfungen enthalten?
  • MySQL effiziente Abfrage Left Join und Gruppieren nach (plus Index)
  • MySQL-Joinpufferprinzip
  • Detaillierte Erklärung verschiedener Join-Zusammenfassungen von SQL

<<:  Vue implementiert kleine Suchfunktion

>>:  Farbverlaufseffekt im HTML-Hintergrund durch CSS-Stil erreicht

Artikel empfehlen

Vue implementiert eine einfache Slider-Verifizierung

Dieses Artikelbeispiel zeigt die Implementierung ...

CSS implementiert den Texteingabefeldstil von Google Material Design (empfohlen)

Hallo zusammen, heute möchte ich Ihnen zeigen, wi...

Spezifische Schritte für den Vue-Browser zur Rückgabe der Überwachung

Vorwort Beim Teilen einer Seite hoffen Sie, durch...

Vue+Flask realisiert Videosynthesefunktion (Drag & Drop-Upload)

Inhaltsverzeichnis Wir haben in einem früheren Ar...

HTML-Grundlagen-Zusammenfassungsempfehlung (Titel)

HTML: Titel Überschriften werden durch Tags wie &...

So erstellen Sie eine Ansicht für mehrere Tabellen in MySQL

Erstellen Sie in MySQL eine Ansicht für zwei oder...

Verwenden von js zur Realisierung eines dynamischen Hintergrunds

In diesem Artikelbeispiel wird der spezifische Co...

Detailliertes Tutorial zur Installation von InfluxDB in Docker (Leistungstest)

1. Voraussetzungen 1. Das Projekt wurde bereitges...

Detaillierte Analyse der MySQL-Sperrblockierung

Bei der täglichen Wartung werden Threads häufig b...

Installieren Sie Ethereum/Ethereum von Grund auf unter CentOS7

Inhaltsverzeichnis Vorwort Fügen Sie Sudo-Schreib...

So erstellen Sie einen Nginx-Server mit Docker

Betriebsumgebung: MAC Docker-Version: Docker vers...

Detaillierte Installation und Konfiguration von hadoop2.7.2 unter Ubuntu15.10

Im Internet und in vielen Büchern gibt es viele T...