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.
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! Das könnte Sie auch interessieren:
|
<<: Lösung für Win10 ohne Hyper-V
>>: Eine kurze Diskussion zur Logikextraktion und Feldanzeige von Vue3 in Projekten
Beachten Sie, dass dies kein von vue-cli erstellt...
Datenbankversion: mysql> select version(); +--...
In allgemeinen Anwendungen verwenden wir die Type...
a : Gibt die Start- oder Zielposition eines Hyper...
Wiederherstellung der MySQL Bin-Protokolldaten: v...
Hallo zusammen, ich bin Liang Xu. Wie wir alle wi...
Da ich möchte, dass die virtuelle Maschine eine e...
Hinweis: Dieser Artikel wurde von jemand anderem ü...
Ich habe mich kürzlich mit Algorithmen beschäftig...
Inhaltsverzeichnis Vorwort Systemumgebung Aktuell...
1. OpenJDK anzeigen rpm -qa|grep jdk 2. Löschen S...
Wir leben in einer visuellen Welt und sind von vi...
Als ich gestern ein Projekt schrieb, musste ich d...
Inhaltsverzeichnis Vorwort Warum müssen wir die T...
1. Kompilierung und Installation von Packetdrill ...