Detaillierte Erläuterung des grundlegenden Implementierungsprinzips von MySQL DISTINCT

Detaillierte Erläuterung des grundlegenden Implementierungsprinzips von MySQL DISTINCT

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:
  • Vergleich und Verwendung von Distinct- und Group By-Anweisungen in MySQL
  • Das Grundprinzip der Distinct-Anweisung in MySQL und sein Vergleich mit Group By
  • Indexoptimierung in MySQL DISTINCT-Anweisung und DISTINCT-Mehrfeldoperation
  • Diskussion über die Distinct-Anweisung in MySQL zum Abfragen doppelter Datensätze und die damit verbundene Leistung
  • Vergleich der Verwendung von distinct und count(*) in MySQL
  • Analysieren Sie die Techniken zur Optimierung von Distinct in MySQL
  • Analyse von MySQL: einzelne Tabelle eindeutig, mehrere Tabellen nach Abfrage gruppieren, um doppelte Datensätze zu entfernen

<<:  Implementierung von Debugging-Code über den Nginx-Reverse-Proxy

>>:  Miniprogramm zur Implementierung der Rechnerfunktion

Artikel empfehlen

Lösung für mehrere Docker-Container, die nicht die gleiche Portnummer haben

Hintergrund In Docker werden vier Container mit d...

Schritte und Methoden zur Bindung von Domänennamen und IPs in der Alibaba Cloud

1 Rufen Sie die Alibaba Cloud-Konsole auf, suchen...

Eine kurze Analyse der parallelen WriteSet-Replikation von MySQL

【Historischer Hintergrund】 Ich arbeite seit drei ...

Was Sie beim Schreiben selbstschließender XHTML-Tags beachten sollten

Das img-Tag in XHTML sollte wie folgt geschrieben...

So installieren Sie den Apache-Dienst im Linux-Betriebssystem

Downloadlink: Betriebsumgebung CentOS 7.6 in eine...

Ein Vergleich zwischen dem href-Attribut und dem onclick-Ereignis des a-Tags

Lassen Sie uns zunächst über die Ausführungsreihe...

CSS- und HTML- und Front-End-Technologie-Schichtendiagramm

Die Beziehung zwischen Javascript und DOM ist seh...

Nexus verwendet Nginx-Proxy zur Unterstützung des HTTPS-Protokolls

Hintergrund Alle Unternehmenswebsites müssen das ...

MySQL 5.7.17 Installations- und Konfigurations-Tutorial für Mac

1. MySQL herunterladen Klicken Sie auf die Downlo...

Eine Zusammenfassung der Gründe, warum MySQL keinen Datumsfeldindex verwendet

Inhaltsverzeichnis Hintergrund erkunden Zusammenf...