Mysql 8.0.18 Hash-Join-Test (empfohlen)

Mysql 8.0.18 Hash-Join-Test (empfohlen)

Hash-Join

Für die Ausführung von Hash Join sind keine Indizes erforderlich, und es ist in den meisten Fällen effizienter als der aktuelle Block-Nested-Loop-Algorithmus.

Der folgende Beispielcode führt den Hash-Join-Test von MySQL 8.0.18 ein. Der spezifische Inhalt ist wie folgt:

ERSTELLEN SIE TABELLE COLUMNS_hj als Auswahl * aus information_schema.`COLUMNS`;
INSERT INTO COLUMNS SELECT * FROM COLUMNS; -- 250.000 Zeilen zum letzten Mal einfügen CREATE TABLE COLUMNS_hj2 as select * from information_schema.`COLUMNS`;
Erläuterung des Formats = Baum
WÄHLEN 
 ANZAHL(c1.PRIVILEGIEN),
 SUMME(c1.Ordinalposition)
AUS
 SPALTEN_hj c1,
 SPALTEN_hj2 c2
WO
 c1.Tabellenname = c2.Tabellenname
UND c1.Spaltenname = c2.Spaltenname
GRUPPELN NACH
 c1.Tabellenname,
 c1.Spaltenname
BESTELLEN BIS
 c1.Tabellenname,
 c1.Spaltenname;

Sie müssen format=tree (eine neue Funktion in 8.0.16) verwenden, um den Ausführungsplan des Hash-Joins anzuzeigen:

-> Sortieren: <temporär>.TABLE_NAME, <temporär>.COLUMN_NAME
 -> Tabellenscan auf <temporär>
  -> Aggregieren mithilfe einer temporären Tabelle
   -> Innerer Hash-Join (c1.`COLUMN_NAME` = c2.`COLUMN_NAME`), (c1.`TABLE_NAME` = c2.`TABLE_NAME`) (Kosten=134217298,97 Zeilen=13421218)
    -> Tabellenscan auf c1 (Kosten=1,60 Zeilen=414619)
    -> Hash
     -> Tabellenscan auf c2 (Kosten=347,95 Zeilen=3237)
setze join_buffer_size=1048576000;

WÄHLEN 
 ANZAHL(c1.PRIVILEGIEN),
 SUMME(c1.Ordinalposition)
AUS
 SPALTEN_hj c1,
 SPALTEN_hj2 c2
WO
 c1.Tabellenname = c2.Tabellenname
UND c1.Spaltenname = c2.Spaltenname
GRUPPELN NACH
 c1.Tabellenname,
 c1.Spaltenname
BESTELLEN BIS
 c1.Tabellenname,
 c1.Spaltenname;

Ungefähr 1,5 Sekunden.


Schauen wir uns BNL noch einmal an. Erstellen Sie zuerst den Index (es ist sinnvoll, sie separat zu optimieren und dann die Ergebnisse zu vergleichen).

Tabelle columns_hj ändern, Index idx_columns_hj löschen;
Tabelle columns_hj2 ändern, Index idx_columns_hj2 löschen;
Erstellen Sie den Index idx_columns_hj auf columns_hj(table_name,column_name);
Erstellen Sie den Index idx_columns_hj2 auf columns_hj2(table_name,column_name);

-> Sortieren: <temporär>.TABLE_NAME, <temporär>.COLUMN_NAME
 -> Tabellenscan auf <temporär>
  -> Aggregieren mithilfe einer temporären Tabelle
   -> Innerer Join mit verschachtelter Schleife (Kosten=454325,17 Zeilen=412707)
    -> Filter: ((c2.`TABLE_NAME` ist nicht null) und (c2.`COLUMN_NAME` ist nicht null)) (Kosten=347,95 Zeilen=3237)
     -> Tabellenscan auf c2 (Kosten=347,95 Zeilen=3237)
    -> Indexsuche auf c1 mit idx_COLUMNS_hj (TABLE_NAME=c2.`TABLE_NAME`, COLUMN_NAME=c2.`COLUMN_NAME`) (Kosten=127,50 Zeilen=127)

Ungefähr 4,5 Sekunden. Es ist ersichtlich, dass der Hash-Join-Effekt immer noch sehr gut ist.

Ich muss mich über die Eingabeaufforderungen des MySQL-Optimierers beschweren. Es scheint, dass HASH_JOIN/NO_HASH_JOIN nicht effektiv sind.

Neben hash_join ist der in MySQL 8.0.3 eingeführte SET_VAR-Optimierungshinweis immer noch sehr nützlich. Er kann verwendet werden, um Parameter auf Anweisungsebene festzulegen (Oracle unterstützt ihn, und ich erinnere mich, dass MariaDB ihn auch unterstützt), und zwar wie folgt:

mysql> select /*+ set_var(optimizer_switch='index_merge=off') set_var(join_buffer_size=4M) */ c_id vom Kundenlimit 1;

Liste der von SET_VAR unterstützten Variablen:

auto_increment_increment
automatischer Inkrementversatz
große_tabellen
Bulk_Insert_Puffergröße
temporäre_Standardspeichermaschine
div_Präzisionsinkrement
Endmarkierungen in JSON
eq_range_index_dive_limit
Fremdschlüsselprüfungen
group_concat_max_len
Einfügen_ID
interner_temporärer_Speicher_Engine
Verbindungspuffergröße
Wartezeit für Sperre
maximale Fehleranzahl
maximale Ausführungszeit
maximale Heaptabellengröße
maximale_Verbindungsgröße
maximale_Länge_für_Sortierdaten
maximale_Punkte_in_Geometrie
max_sucht_nach_Schlüssel
maximale Sortierlänge
optimizer_prune_level
optimizer_search_depth-Variablen
Optimiererschalter
Bereich_Zuweisungsblockgröße
Bereichsoptimierer_max_Speichergröße
Puffergröße lesen
Puffergröße lesen
Sortierpuffergröße
sql_auto_is_null
sql_big_selects
sql_buffer_result
sql_modus
sql_safe_updates
sql_select_limit
Zeitstempel
temporäre_Tabellengröße
aktualisierbare Ansichten mit Limit
einzigartige_checks
windowing_use_high_precision

Zusammenfassen

Oben ist der vom Herausgeber eingeführte Mysql 8.0.18-Hash-Join-Test. Ich hoffe, er ist für alle hilfreich. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Herausgeber wird Ihnen rechtzeitig antworten. Ich möchte auch allen für ihre Unterstützung der Website 123WORDPRESS.COM danken!
Wenn Sie diesen Artikel hilfreich finden, können Sie ihn gerne abdrucken und dabei bitte die Quelle angeben. Vielen Dank!

Das könnte Sie auch interessieren:
  • Grundlegende MySQL-Tabellenabfragen – häufige Fehler beim Left-Join
  • Analyse des Unterschieds zwischen der Verwendung von Left Join-Einstellungsbedingungen in „on“ und „where“ in MySQL
  • Zusammenfassung verschiedener gängiger Abfragebeispiele für Join-Tabellen in MySQL
  • MySQL 8.0.18 Hash Join unterstützt keine Links-/Rechts-Joins. Probleme mit Links- und Rechts-Joins
  • Neue Funktionen in MySQL 8.0: Hash Join
  • Stabile Version von MySQL 8.0.18 veröffentlicht! Hash Join ist wie erwartet da
  • Detaillierte Erklärung zur Verwendung von Join zur Optimierung von SQL in MySQL
  • Abfrageprozess und Optimierungsmethode der (JOIN/ORDER BY)-Anweisung in MySQL
  • Tiefgreifendes Verständnis der MySQL-Selbstverbindung und Join-Assoziation
  • Beispielanalyse für MySQL-Jointabelle und automatische ID-Inkrementierung

<<:  Lösung für Win10 ohne Hyper-V

>>:  Eine kurze Diskussion zur Logikextraktion und Feldanzeige von Vue3 in Projekten

Artikel empfehlen

Beispielcode für den Song-Fortschrittsbalken in Vue

Beachten Sie, dass dies kein von vue-cli erstellt...

HTML-Elemente (Tags) und ihre Verwendung

a : Gibt die Start- oder Zielposition eines Hyper...

Das vergessene Button-Tag

Hinweis: Dieser Artikel wurde von jemand anderem ü...

Teilen des JS-nativen Quellcodes des Spiels 2048 (das Neueste im Internet)

Ich habe mich kürzlich mit Algorithmen beschäftig...

So verkleinern Sie das Stammverzeichnis des XFS-Partitionsformats in Linux

Inhaltsverzeichnis Vorwort Systemumgebung Aktuell...

Verzeichnisberechtigungen beim Erstellen eines Containers mit Docker

Als ich gestern ein Projekt schrieb, musste ich d...

Vollständiger Schrittbericht zur Vue-Kapselung allgemeiner Tabellenkomponenten

Inhaltsverzeichnis Vorwort Warum müssen wir die T...

Packetdrills prägnantes Benutzerhandbuch

1. Kompilierung und Installation von Packetdrill ...