Sollte ich zum Entfernen von Duplikaten in MySQL „distinct“ oder „group by“ verwenden?

Sollte ich zum Entfernen von Duplikaten in MySQL „distinct“ oder „group by“ verwenden? Leistungsverhältnis Geringe Menge, wenige Sorten Kleine Menge, viele Sorten Große Anzahl an KategorienKeine IndizierungEtwas besserEindeutig ist besserMit IndizierungEtwas andersEtwas andersEtwas andersEtwas andersEtwas anders

Wenn im Deduplizierungsszenario kein Index hinzugefügt wird, wird wahrscheinlicher „distinct“ verwendet. Wenn jedoch ein Index hinzugefügt wird, können sowohl „distinct“ als auch „group by“ verwendet werden.

Zusammenfassen

In diesem Artikel geht es darum, ob für die MySQL-Deduplizierung „distinct“ oder „group by“ verwendet werden soll. Dies ist das Ende des Artikels. Weitere Informationen zur MySQL-Deduplizierung „Distinct Group By“ finden Sie in den vorherigen Artikeln von 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:
  • Eine kurze Diskussion zur MySQL-Select-Optimierungslösung
  • MySQL-Beispiel-Tutorial: Ergebnisse auswählen, um ein Update durchzuführen
  • Beheben Sie das Problem, dass die Lese-/Schreibtrennung von MySQL dazu führt, dass Daten nach dem Einfügen nicht ausgewählt werden
  • Wie die MySQL Select-Anweisung ausgeführt wird
  • Detailliertes Beispiel zur Verwendung der distinct-Methode in MySQL
  • Der Unterschied zwischen distinct und group by in MySQL
  • Lassen Sie uns ausführlich über die LIMIT-Anweisung in MySQL sprechen
  • Tutorial der MySQL-Reihe zum Verständnis der Verwendung der Schlüsselwörter „union“ (alles), „limit“ und „exists“
  • Die Auswirkungen des Limits auf die Abfrageleistung in MySQL
  • Verwendung von „Select“, „Distinct“ und „Limit“ in MySQL

Vorwort

Zum Leistungsvergleich zwischen „group by“ und „distinct“: Die Schlussfolgerung im Internet lautet wie folgt: „distinct“ bietet eine bessere Leistung bei kleinen Datenmengen ohne Index, „group by“ bietet eine bessere Leistung bei großen Datenmengen. „Group by“ mit Index bietet eine bessere Leistung. Beim Durchgehen des Index gilt: Je weniger Gruppierungstypen vorhanden sind, desto schneller ist die Unterscheidung. Überprüfen Sie die gezogenen Schlussfolgerungen online.

Deaktivieren des Abfragecaches während der Vorbereitungsphase

Überprüfen Sie, ob der Abfragecache in MySQL eingestellt ist. Um die Testergebnisse nicht zu beeinträchtigen, müssen Sie den Abfragecache deaktivieren.

Variablen wie „%query_cache%“ anzeigen; 

Bildbeschreibung hier einfügen

Überprüfen Sie, ob der Abfrage-Cache aktiviert ist oder nicht. Dies wird durch query_cache_type und query_cache_size bestimmt.

  • Methode 1: Um den Abfragecache auszuschalten, müssen Sie my.ini suchen und query_cache_type Sie müssen die Konfigurationsdatei C:\ProgramData\MySQL\MySQL Server 5.7\my.ini ändern und query_cache_type=0或2 ändern.
  • Methode 2: Setzen Sie query_cache_size auf 0 und führen Sie die folgende Anweisung aus.
Setze globale query_cache_size = 0;

Methode 3: Wenn Sie den Abfrage-Cache nicht deaktivieren möchten, können Sie auch RESET QUERY CACHE verwenden.

In der aktuellen Testumgebung bedeutet query_cache_type=2, dass die Abfrage bei Bedarf zwischengespeichert wird. Der Standardabfragemodus ist kein Zwischenspeichern. Wenn Zwischenspeichern erforderlich ist, müssen Sie der Abfrageanweisung sql_cache hinzufügen.

Datenaufbereitung

Tabelle t0 speichert 100.000少量種類少

Tabelle löschen, falls vorhanden t0;
Tabelle t0 erstellen(
ID Bigint Primärschlüssel Auto_Increment,
ein varchar(255) ungleich null
) Engine=InnoDB Standardzeichensatz=utf8mb4 Sortierung=utf8mb4_bin;
1
2
3
4
5
Löschprozedur insert_t0_simple_category_data_sp;
Trennzeichen //
Prozedur „insert_t0_simple_category_data_sp(IN num int)“ erstellen
beginnen
setze @i = 0;
während @i < num do
	in t0(a) einfügen value(truncate(@i/1000, 0));
 setze @i = @i + 1;
Ende während;
Ende
//
Rufen Sie insert_t0_simple_category_data_sp(100000) auf;

Tabelle t1 speichert 10.000少量種類多

Tabelle löschen, falls vorhanden, t1;
Tabelle t1 wie t0 erstellen;
1
2
Löschprozedur insert_t1_complex_category_data_sp;
Trennzeichen //
Prozedur „insert_t1_complex_category_data_sp(IN num int)“ erstellen
beginnen
setze @i = 0;
während @i < num do
	in t1(a) einfügen value(truncate(@i/10, 0));
 setze @i = @i + 1;
Ende während;
Ende
//
Rufen Sie insert_t1_complex_category_data_sp(10000) auf;

Die T2-Tabelle speichert 5 Millionen大量種類多

Tabelle löschen, falls vorhanden, t2;
Erstellen Sie Tabelle t2 wie t1;
1
2
Löschprozedur insert_t2_complex_category_data_sp;
Trennzeichen //
Prozedur „insert_t2_complex_category_data_sp(IN num int)“ erstellen
beginnen
setze @i = 0;
während @i < num do
	in t1(a) einfügen value(truncate(@i/10, 0));
 setze @i = @i + 1;
Ende während;
Ende
//
Rufen Sie insert_t2_complex_category_data_sp(5000000) auf;

Testphase

Überprüfen Sie eine kleine Datenmenge

Nicht indiziert

Profilierung festlegen = 1;
wähle ein anderes a als t0;
Profile anzeigen;
Wähle a aus der t0-Gruppe nach a;
Profile anzeigen;
Tabelle t0 ändern, Index `a_t0_index`(a) hinzufügen; 

Bildbeschreibung hier einfügen

Dies zeigt, dass bei einer kleinen Anzahl von Typen und wenigen Daten ohne Indizierung die Leistung von „distinct“ und „group by“ nahezu gleich ist.

Index hinzufügen

Tabelle t0 ändern, Index `a_t0_index`(a) hinzufügen;

Nach der Ausführung einer Abfrage ähnlich der obigen

Bildbeschreibung hier einfügen

Dies zeigt, dass bei einer kleinen Anzahl von Typen und wenigen Daten die Leistung von distinct und group by beim Hinzufügen von Indizes nahezu gleich ist.

Stellen Sie sicher, dass eine kleine Datenmenge mit vielen Typen nicht indiziert ist

Nach der Ausführung einer ähnlichen nicht indizierten Abfrage wie oben

Bildbeschreibung hier einfügen

Daraus lässt sich erkennen, dass bei kleinen Datenmengen mit vielen Typen und ohne Index die Leistung von „distinct“ etwas höher ist als die von „group by“, der Unterschied jedoch nicht groß ist.

Index hinzufügen

Tabelle t1 ändern, Index `a_t1_index`(a) hinzufügen;

Nach der Ausführung einer ähnlichen, nicht indizierten Abfrage

Bildbeschreibung hier einfügen

Daraus lässt sich erkennen, dass bei einer kleinen Datenmenge und vielen Typen die Leistung von „distinct“ und „group by“ beim Hinzufügen von Indizes nahezu gleich ist.

Große Datenmengen verifizieren

Nicht indiziert

WÄHLE Anzahl(1) AUS t2; 

Bildbeschreibung hier einfügen

Nach der Ausführung einer ähnlichen nicht indizierten Abfrage wie oben

Bildbeschreibung hier einfügen

Dies zeigt, dass DISTINCT bei großen Datenmengen vieler Typen und ohne Indizierung eine bessere Leistung erbringt als GROUP BY.

Index hinzufügen

Tabelle t2 ändern, Index `a_t2_index`(a) hinzufügen;

Nach der Ausführung der oben genannten ähnlichen Indexabfrage

Bildbeschreibung hier einfügen

Dies zeigt, dass bei großen Datenmengen vieler Typen die Leistung von „distinct“ und „group by“ beim Hinzufügen von Indizes nahezu gleich ist.

Zusammenfassen

<<:  So stellen Sie Tencent Cloud Server von Grund auf bereit

>>:  Vue+echarts realisiert Fortschrittsbalken-Histogramm

Artikel empfehlen

So vereinfachen Sie Redux mit Redux Toolkit

Inhaltsverzeichnis Probleme, die Redux Toolkit lö...

Zusammenfassung der Wissenspunkte zum B-Tree-Index bei der MySQL-Optimierung

Warum müssen wir SQL optimieren? Wenn wir SQL-Anw...

Zusammenfassung der Methoden zum Abfragen von MySQL-Benutzerberechtigungen

Einführung von zwei Methoden zum Anzeigen von MyS...

JavaScript, um das Bild mit der Maus zu bewegen

In diesem Artikel wird der spezifische JavaScript...

Elemente der Benutzererfahrung oder Elemente des Webdesigns

System- und Benutzerumgebungsdesign <br />D...

Detaillierte Erläuterung der Implementierung der Nginx-Prozesssperre

Inhaltsverzeichnis 1. Die Rolle der Nginx-Prozess...

Eine kurze Diskussion über den Unterschied zwischen src und href in HTML

Einfach ausgedrückt bedeutet src „Ich möchte dies...

MySQL-Abfrage-Cache und Pufferpool

1. Caches - Abfrage-Cache Die folgende Abbildung ...

Einführung in die Vue3 Composition API

Inhaltsverzeichnis Überblick Beispiel Warum wird ...

So öffnen Sie den Port in Centos7

Die Standard-Firewall von CentOS7 ist nicht iptab...

Lassen Sie uns das Ereignisobjekt in js genauer verstehen

Wir wissen, dass die in JS am häufigsten verwende...