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

Detaillierte Erklärung zur SQL-Injection - Sicherheit (Teil 2)

Sollte dieser Artikel Fehler enthalten oder du An...

Detaillierte Beispiele für Docker-Compose-Netzwerke

Ich habe heute mit den Netzwerkeinstellungen unte...

So ändern Sie den Standardspeicherort von Docker-Images (Lösung)

Aufgrund der anfänglichen Partitionierung des Sys...

Detaillierte Erläuterung des Nginx-Forward-Proxys und des Reverse-Proxys

Inhaltsverzeichnis Weiterleitungsproxy Nginx-Reve...

Hinweise zur IE8-Kompatibilität, die mir aufgefallen sind

1. getElementById von IE8 unterstützt nur IDs, nic...

Zusammenfassung ungewöhnlicher Operatoren und Operatoren in js

Zusammenfassung gängiger Operatoren und Operatore...

So installieren Sie den MySQL 5.7.28-Binärmodus unter CentOS 7.4

Linux-Systemversion: CentOS7.4 MySQL-Version: 5.7...

So exportieren Sie eine CSV-Datei mit Header in MySQL

Siehe das offizielle Dokument http://dev.mysql.co...

Erfahrungsaustausch zur MySQL-Slave-Wartung

Vorwort: Die MySQL-Master-Slave-Architektur dürft...

So führen Sie den Top-Befehl im Batchmodus aus

Der Befehl „top“ ist der beste Befehl, den jeder ...

Ich habe ein paar coole Designseiten zusammengestellt, die ich gut finde.

Sie müssen Inspiration haben, um eine Website zu g...