Vorwort DISTINCT ist tatsächlich der Implementierung der GROUP BY-Operation sehr ähnlich, mit der Ausnahme, dass nach GROUP BY nur ein Datensatz aus jeder Gruppe entnommen wird. Daher ist die Implementierung von DISTINCT grundsätzlich dieselbe wie die von GROUP BY und weist kaum Unterschiede auf. Dasselbe kann durch einen losen Index-Scan oder einen kompakten Index-Scan erreicht werden. Wenn DISTINCT nicht nur durch Indizes abgeschlossen werden kann, kann MySQL es natürlich nur durch temporäre Tabellen abschließen. Ein Unterschied zu GROUP BY besteht jedoch darin, dass DISTINCT keine Sortierung erfordert. Das heißt, wenn die Abfrage, die nur die DISTINCT-Operation ausführt, die Operation nicht allein unter Verwendung des Indexes abschließen kann, verwendet MySQL eine temporäre Tabelle, um die Daten „zwischenzuspeichern“, führt jedoch keine Dateisortieroperation für die Daten in der temporären Tabelle aus. Wenn wir GROUP BY verwenden und beim Ausführen von DISTINCT eine Gruppierung durchführen und Aggregatfunktionen wie MAX verwenden, lässt sich die Dateisortierung natürlich nicht vermeiden. Nachfolgend demonstrieren wir anhand einiger einfacher Abfragebeispiele die Implementierung von DISTINCT. 1. Sehen wir uns zunächst die DISTINCT-Operation an, die durch einen losen Index-Scan durchgeführt wird: sky@localhost: Beispiel 11:03:41> EXPLAIN SELECT DISTINCT group_id -> VON GruppennachrichtG *************************** 1. Reihe *************************** ID: 1 SELECT_type: SIMPLE Tabelle: Gruppennachricht Typ: Bereich mögliche Schlüssel: NULL Schlüssel: idx_gid_uid_gc Schlüssellänge: 4 Ref: NULL Reihen: 10 Extra: Verwenden des Indexes für „Gruppieren nach“ 1 Zeile im Satz (0,00 Sek.) Wir können deutlich erkennen, dass die Zusatzinformation im Ausführungsplan „Index für Gruppieren nach verwenden“ lautet. Was bedeutet das? Warum teilt mir der Ausführungsplan mit, dass GROUP BY über den Index ausgeführt wird, wenn ich keine GROUP BY-Operation ausgeführt habe? Tatsächlich hängt dies mit dem Implementierungsprinzip von DISTINCT zusammen. Bei der Implementierung von DISTINCT ist auch eine Gruppierung erforderlich, und dann wird aus jeder Gruppe ein Datenelement entnommen und an den Client zurückgegeben. Die zusätzlichen Informationen hier sagen uns, dass MySQL den gesamten Vorgang mithilfe eines losen Index-Scans abschließt. Natürlich wäre es besser und leichter zu verstehen, wenn MySQL Query Optimizer benutzerfreundlicher wäre und die Information hier in „Index für unterschiedliche Angaben verwenden“ geändert werden könnte, haha. 2. Schauen wir uns ein Beispiel für das Scannen eines kompakten Indexes an: sky@localhost: Beispiel 11:03:53> EXPLAIN SELECT DISTINCT user_id -> VON Gruppennachricht -> WO group_id = 2G *************************** 1. Reihe *************************** ID: 1 SELECT_type: SIMPLE Tabelle: Gruppennachricht Typ: ref mögliche Schlüssel: idx_gid_uid_gc Schlüssel: idx_gid_uid_gc Schlüssellänge: 4 Verweis: const Reihen: 4 Extra: WHERE verwenden; Index verwenden 1 Zeile im Satz (0,00 Sek.) Die Anzeige hier ist exakt dieselbe wie bei der Implementierung von GROUP BY durch kompakten Index-Scan. Tatsächlich lässt MySQL während der Implementierung dieser Abfrage die Speicher-Engine alle Indexschlüssel von group_id = 2 scannen, um alle user_ids zu erhalten, und verwendet dann die sortierten Eigenschaften des Index, um jedes Mal, wenn der Indexschlüsselwert von user_id geändert wird, eine Information beizubehalten. Der gesamte DISTINCT-Vorgang kann abgeschlossen werden, wenn alle Indexschlüssel von group_id = 2 gescannt werden. 3. Sehen wir uns nun an, was passiert, wenn DISTINCT nicht allein mit einem Index erreicht werden kann: sky@localhost: Beispiel 11:04:40> EXPLAIN SELECT DISTINCT user_id -> VON Gruppennachricht -> WO group_id > 1 UND group_id < 10G *************************** 1. Reihe *************************** ID: 1 SELECT_type: SIMPLE Tabelle: Gruppennachricht Typ: Bereich mögliche Schlüssel: idx_gid_uid_gc Schlüssel: idx_gid_uid_gc Schlüssellänge: 4 Ref: NULL Reihen: 32 Extra: Verwenden von WHERE; Verwenden von Index; Verwenden von temporären 1 Zeile im Satz (0,00 Sek.) Wenn MySQL die DISTINCT-Operation nicht ausschließlich auf der Grundlage des Indexes abschließen kann, muss es für die entsprechende Operation eine temporäre Tabelle verwenden. Wir können jedoch sehen, dass es sich bei der Verwendung temporärer Tabellen zur Vervollständigung von DISTINCT durch MySQL geringfügig von der Verarbeitung von GROUP BY unterscheidet, d. h. es erfolgt keine Dateisortierung. Tatsächlich ist im Gruppierungsalgorithmus von MySQL eine Sortierung nicht unbedingt erforderlich, um den Gruppierungsvorgang abzuschließen. Dies habe ich bereits in den obigen GROUP BY-Optimierungstipps erwähnt. Tatsächlich implementiert MySQL die Gruppierung und schließt die DISTINCT-Operation ohne Sortierung ab, sodass die Sortieroperation Filesort fehlt. 4. Versuchen Sie abschließend, es mit GROUP BY zu kombinieren: sky@localhost: Beispiel 11:05:06> EXPLAIN SELECT DISTINCT max(user_id) -> VON Gruppennachricht -> WO group_id > 1 UND group_id < 10 -> GRUPPE NACH group_idG *************************** 1. Reihe *************************** ID: 1 SELECT_type: SIMPLE Tabelle: Gruppennachricht Typ: Bereich mögliche Schlüssel: idx_gid_uid_gc Schlüssel: idx_gid_uid_gc Schlüssellänge: 4 Ref: NULL Reihen: 32 Extra: WHERE verwenden; Index verwenden; Temporär verwenden; Filesort verwenden 1 Zeile im Satz (0,00 Sek.) Schauen wir uns abschließend dieses Beispiel der Verwendung einer Aggregatfunktion zusammen mit GROUP BY an. Im Vergleich zum dritten Beispiel oben können wir sehen, dass es einen zusätzlichen Filesort-Sortiervorgang gibt, da wir die MAX-Funktion verwendet haben. Um den MAX-Wert nach der Gruppierung zu erhalten, kann der Vorgang nicht mithilfe des Index abgeschlossen werden, sondern nur durch Sortieren. Da die Implementierung von DISTINCT grundsätzlich mit der von GROUP BY identisch ist, wird in diesem Artikel der Implementierungsprozess nicht bildlich dargestellt. Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird. Das könnte Sie auch interessieren:
|
<<: Implementierung von Debugging-Code über den Nginx-Reverse-Proxy
>>: Miniprogramm zur Implementierung der Rechnerfunktion
Vorwort Ich weiß nicht, wie lange dieser Freund D...
Inhaltsverzeichnis 1. Was ist Lazy Loading? 2. Im...
Vorwort Leser, die mit MySQL vertraut sind, werde...
Schauen wir uns den Panorama-Effekt an: Adresse a...
Ich möchte Ihnen einen kreativen Einstieg vorstel...
Installation und Konfiguration Die offizielle Web...
Normale MySQL-Sortierung, benutzerdefinierte Sort...
Wenn wir einem Rechteck oder einer anderen Form, ...
In letzter Zeit habe ich jeden Tag an meinen Absch...
PS: Ich verwende hier PHPStudy2016 1. Stoppen Sie...
RGBA ist eine CSS-Farbe, mit der Farbwert und Tra...
Inhaltsverzeichnis 1. Titel 2. Code 3. Ergebnisse...
Einführung: Im Internet gibt es zahlreiche Inform...
1. Stoppen Sie zuerst den mysqld.exe-Prozess 2. Ö...
Inhaltsverzeichnis Einführung Wirkung Prinzip bil...