UNIONUNION-Semantik: Nimm die Vereinigung der beiden Unterabfrageergebnisse und behalte nur eine Zeile mit doppelten Zeilen bei. TabelleninitialisierungTABELLE ERSTELLEN t1(id INT PRIMARY KEY, a INT, b INT, INDEX(a)); TRENNUNGSZEICHEN ;; PROZEDUR ERSTELLEN idata() BEGINNEN Erklären Sie, dass ich INT; Setze i = 1; WHILE (i<= 1000) DO IN t1 WERTE EINFÜGEN (i,i,i); Setze i = i + 1; ENDE WÄHREND; ENDE;; TRENNUNGSZEICHEN ; Rufen Sie idata() auf; Execute-Anweisung(SELECT 1000 AS f) UNION (SELECT id FROM t1 ORDER BY id DESC LIMIT 2); mysql> ERKLÄREN (SELECT 1000 AS f) UNION (SELECT id FROM t1 ORDER BY id DESC LIMIT 2); +----+--------------+------------+------------+-------+---------------+--------+---------+---------+------+------+------+----------+----------+----------------------------------+ | ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra | +----+--------------+------------+------------+-------+---------------+--------+---------+---------+------+------+------+----------+----------+----------------------------------+ | 1 | PRIMARY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Keine Tabellen verwendet | | 2 | UNION | t1 | NULL | index | NULL | PRIMARY | 4 | NULL | 2 | 100.00 | Rückwärts-Indexscan; Index wird verwendet | | NULL | UNION-ERGEBNIS | <union1,2> | NULL | ALL | NULL | NULL | NULL | NULL | NULL | NULL | Temporäre | verwenden | +----+--------------+------------+------------+-------+---------------+--------+---------+---------+------+------+------+----------+----------+----------------------------------+ Die zweite Zeile hat
UNION-ERGEBNIS
UNION ALLE mysql> ERKLÄREN (SELECT 1000 AS f) UNION ALL (SELECT id FROM t1 ORDER BY id DESC LIMIT 2); +----+----------+----------+---------+-----------+---------------+--------+---------+---------+------+------+------+----------+----------------------------------+ | ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra | +----+----------+----------+---------+-----------+---------------+--------+---------+---------+------+------+------+----------+----------------------------------+ | 1 | PRIMARY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Keine Tabellen verwendet | | 2 | UNION | t1 | NULL | index | NULL | PRIMARY | 4 | NULL | 2 | 100.00 | Rückwärts-Indexscan; Index wird verwendet | +----+----------+----------+---------+-----------+---------------+--------+---------+---------+------+------+------+----------+----------------------------------+ GRUPPELN NACHAusreichend Speicher-- 16777216 Bytes = 16 MB mysql> VARIABLEN ANZEIGEN wie '%tmp_table_size%'; +-----------------+----------+ | Variablenname | Wert | +-----------------+----------+ | tmp_tabellengröße | 16777216 | +-----------------+----------+ Execute-Anweisung-- Ausführen auf MySQL 5.6mysql> EXPLAIN SELECT id%10 AS m, COUNT(*) AS c FROM t1 GROUP BY m; +----+-----------+-------+-----------+---------------+------+---------+---------+------+------+---------+----------------------------------------------+ | ID | Auswahltyp | Tabelle | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | Extra | +----+-----------+-------+-----------+---------------+------+---------+---------+------+------+---------+----------------------------------------------+ | 1 | SIMPLE | t1 | index | PRIMARY,a | a | 5 | NULL | 1000 | Index wird verwendet; Temporär wird verwendet; Filesort wird verwendet | +----+-----------+-------+-----------+---------------+------+---------+---------+------+------+---------+----------------------------------------------+ mysql> SELECT id%10 AS m, COUNT(*) AS c FROM t1 GROUP BY m; +------+-----+ | m | c | +------+-----+ | 0 | 100 | | 1 | 100 | | 2 | 100 | | 3 | 100 | | 4 | 100 | | 5 | 100 | | 6 | 100 | | 7 | 100 | | 8 | 100 | | 9 | 100 | +------+-----+ Temporär verwenden: Gibt an, dass eine Ausführungsprozess
SortierprozessORDER BY NULL-- Überspringen Sie den letzten Sortierschritt und rufen Sie die Daten direkt aus der temporären Tabelle mysql> EXPLAIN SELECT id%10 AS m, COUNT(*) AS c FROM t1 GROUP BY m ORDER BY NULL; ab. +----+-----------+-------+-----------+---------------+------+---------+---------+------+---------+---------+------------------------------+ | ID | Auswahltyp | Tabelle | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | Extra | +----+-----------+-------+-----------+---------------+------+---------+---------+------+---------+---------+------------------------------+ | 1 | SIMPLE | t1 | index | PRIMARY,a | a | 5 | NULL | 1000 | Index wird verwendet; Temporär wird verwendet | +----+-----------+-------+-----------+---------------+------+---------+---------+------+---------+---------+------------------------------+ -- Die Daten in t1 beginnen bei 1 mysql> SELECT id%10 AS m, COUNT(*) AS c FROM t1 GROUP BY m ORDER BY NULL; +------+-----+ | m | c | +------+-----+ | 1 | 100 | | 2 | 100 | | 3 | 100 | | 4 | 100 | | 5 | 100 | | 6 | 100 | | 7 | 100 | | 8 | 100 | | 9 | 100 | | 0 | 100 | +------+-----+ Nicht genügend ArbeitsspeicherSetzen Sie die temporäre Tabellengröße auf 1024. Execute-Anweisung-- Die Obergrenze der temporären Speichertabelle beträgt 1024 Bytes, aber die temporäre Speichertabelle kann nicht vollständig 100 Datenzeilen aufnehmen. Die temporäre Speichertabelle wird in eine temporäre Festplattentabelle konvertiert und standardmäßig wird die InnoDB-Engine verwendet. -- Wenn t1 sehr groß ist, nimmt die für diese Abfrage erforderliche temporäre Festplattentabelle viel Speicherplatz in Anspruch mysql> SELECT id%100 AS m, count(*) AS c FROM t1 GROUP BY m ORDER BY NULL LIMIT 10; +------+----+ | m | c | +------+----+ | 1 | 10 | | 2 | 10 | | 3 | 10 | | 4 | 10 | | 5 | 10 | | 6 | 10 | | 7 | 10 | | 8 | 10 | | 9 | 10 | | 10 | 10 | +------+----+ OptimierungsplanIndizes optimieren Unabhängig davon, ob eine temporäre Tabelle im Speicher oder auf der Festplatte verwendet wird, erfordert Der Grund für die Notwendigkeit einer temporären Tabelle: Wenn Sie sicherstellen können, dass die Eingabedaten in der richtigen Reihenfolge sind, müssen Sie beim Berechnen
-- Führen Sie ALTER TABLE t1 ADD COLUMN z INT GENERATED ALWAYS AS(id % 100), ADD INDEX(z) unter MySQL 5.7 aus; -- Es wird ein abdeckender Index verwendet, es ist keine temporäre Tabelle oder Sortierung erforderlichmysql> EXPLAIN SELECT z, COUNT(*) AS c FROM t1 GROUP BY z; +----+----------+----------+---------+-------+---------------+-----------+---------+---------+------+---------+---------+----------+----------+ | ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra | +----+----------+----------+---------+-------+---------------+-----------+---------+---------+------+---------+---------+----------+----------+ | 1 | SIMPLE | t1 | NULL | Index | z | z | 5 | NULL | 1000 | 100,00 | Index wird verwendet | +----+----------+----------+---------+-------+---------------+-----------+---------+---------+------+---------+---------+----------+----------+ 2 Direkte Sortierung Wenn eine Sie können direkt eine temporäre Datenträgertabelle verwenden und Die temporäre Datenträgertabelle verwendet ursprünglich B+-Baumspeicher, der nicht so effizient ist wie Array-Speicher. Wenn der Optimierer
Ausführungsprozess-- Es wird keine temporäre Tabelle verwendet, sondern der Sortieralgorithmus wird direkt verwendet mysql> EXPLAIN SELECT SQL_BIG_RESULT id%100 AS m, COUNT(*) AS c FROM t1 GROUP BY m; +----+-----------+----------+-----------+---------------+------+---------+---------+------+---------+---------+-----------------------------+ | ID | Auswahltyp | Tabelle | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | Extra | +----+-----------+----------+-----------+---------------+------+---------+---------+------+---------+---------+-----------------------------+ | 1 | SIMPLE | t1 | index | PRIMARY,a | a | 5 | NULL | 1000 | Index wird verwendet; Filesort wird verwendet | +----+-----------+----------+-----------+---------------+------+---------+---------+------+---------+---------+-----------------------------+ Initialisieren Sie Scannen Sie den Index a von t1, nehmen Sie die darin enthaltenen ID-Werte nacheinander heraus und fügen Sie den Wert von id%100 in Sortieren Sie nach Abschluss des Scanvorgangs das Feld m des Nach dem Sortieren erhalten wir ein geordnetes Array. Wir durchlaufen das geordnete Array, um die Häufigkeit zu ermitteln, mit der jeder Wert vorkommt (ähnlich der Methode zur Indexoptimierung oben). Vergleich mit DISTINCT-- Standard-SQL, fügen Sie eine Aggregatfunktion COUNT(*) im SELECT-Teil hinzu Wählen Sie a, COUNT(*) aus t GROUP BY a ORDER BY NULL; -- Nicht standardmäßiges SQL WÄHLEN Sie ein AUS t GRUPPE NACH einem ORDER BY NULL; WÄHLEN SIE DISTINCT a FROM t; Standard-SQL: Gruppieren nach Feld a und Zählen, wie oft a in jeder Gruppe vorkommt Nicht-Standard-SQL: Kein
Wenn keine Aggregatfunktion erforderlich ist, sind Semantik, Ausführungsfluss und Leistung von
Zusammenfassung
Verweise„MySQL Praxis 45 Vorlesungen“ Dies ist das Ende dieses Artikels über die spezifische Verwendung interner temporärer MySQL-Tabellen. Weitere relevante interne temporäre MySQL-Tabellen 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:
|
<<: So verwenden Sie CSS, um eine Box horizontal und vertikal zu zentrieren (8 Methoden)
>>: So legen Sie eine feste IP-Adresse für eine virtuelle VMware-Maschine fest (grafisches Tutorial)
Anti-Crawler-Richtliniendatei hinzugefügt: vim /u...
Heute zeige ich Ihnen ein mit nativem JS implemen...
MySQL 5.7.9 Version sql_mode=only_full_group_by P...
Vorwort Ich bin bei der Arbeit auf folgende Situa...
Axios in Vue einfügen importiere Axios von „Axios...
PS: So deaktivieren Sie die Remote-Anmeldung des ...
Docker wird immer ausgereifter und seine Funktion...
Vorwort Im WeChat-Applet können Sie globalData vo...
Bereitstellungsumgebung: Hier wird ein Docker-Con...
NodeJS kopiert die Dateien: Für den Kopiervorgang...
1. MySQL-Archiv herunterladen (dekomprimierte Ver...
[LeetCode] 181.Mitarbeiter verdienen mehr als ihr...
In diesem Artikel wird die Click-to-Switch-Bildko...
In Unternehmen hat die hohe Verfügbarkeit von Dat...
Inhaltsverzeichnis Vorwort Problembeschreibung Ur...