Lassen Sie uns darüber sprechen, wie MySQL mit der Sortierung umgeht

Dieser Artikel wurde von der Huawei Cloud Community geteilt: „ Wie geht MySQL mit der Sortierung um⭐️Wie optimiert man Abfragen, die sortiert werden müssen?“ ", Autor: Caicais Back-End-Privatküche.

Vorwort

Diese beiden Schlüsselwörter werden häufig in MySQL-Abfragen verwendet . order by  group by 

Gemeinsam ist ihnen, dass sie alle die Felder sortieren. Wie wird die Sortierung in der Abfrageanweisung implementiert?

Es gibt zwei Verarbeitungssituationen, in denen die verwendete Abfrageanweisung sortiert werden muss:

  1. Die aktuellen Datensätze sind von Natur aus geordnet und müssen nicht sortiert werden.
  2. Der aktuelle Datensatz behält die Reihenfolge nicht bei und muss sortiert werden

Verwenden Sie Indizes, um die Reihenfolge sicherzustellen

Im ersten Fall wird häufig die Reihenfolge der Indexspalten im Sekundärindex verwendet, um die Reihenfolge der Ergebnismenge sicherzustellen, sodass keine Sortierung erforderlich ist.

Erstellen Sie für Tabelle a einen Sekundärindex für a2, dann wird a2 nach dem Sekundärindex sortiert.

TABELLE „a“ ERSTELLEN (
   `a1` int(11) NOT NULL AUTO_INCREMENT,
   `a2` varchar(255) ZEICHENSATZ utf8mb4 STANDARD NULL,
   `a3` varchar(255) DEFAULT NULL,
   PRIMÄRSCHLÜSSEL (`a1`),
   SCHLÜSSEL `idx_a2` (`a2`)
 ) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8;

select * from a order by a.a2 limit 10

Wenn sich der Optimierer für die Verwendung des a2-Index entscheidet, werden die Datensätze in der a2-Spalte selbst geordnet, sodass kein weiterer Aufwand für die Sortierung erforderlich ist.

Bild.png

Natürlich verwendet der Optimierer möglicherweise nicht den a2-Index (wenn der Optimierer der Meinung ist, dass die Verwendung von a2 zur Rückgabe der Tabelle zu teuer ist, verwendet er einen vollständigen Tabellenscan).

Bild.png

Wenn a2 im vom Optimierer verwendeten Index nicht in der richtigen Reihenfolge ist, werden die Ergebnisse auf andere Weise sortiert.

Dateisortierung

Wenn die Zusatzinformationen des Ausführungsplans angezeigt werden , wird sort_buffer zum Sortieren der Ergebnisse verwendet. Using filesort 

sort_buffer ist ein Teil des Speichers, der zum Sortieren verwendet wird. sort_buffer speichert möglicherweise alle für die Abfrage erforderlichen Felder oder nur die Felder und Primärschlüssel, die sortiert werden müssen.

show variables like 'max_length_for_sort_data'

Wenn die Länge der für die Abfrage erforderlichen Felder kleiner als 1 ist , werden alle für die Abfrage erforderlichen Felder in sort_buffer abgelegt, dann werden die zu sortierenden Spalten sortiert und schließlich werden die Ergebnisse zurückgegeben. max_length_for_sort_data 

Bild.png

Wenn die Länge des für die Abfrage erforderlichen Felds größer ist als die Länge des Felds , werden nur die Felder und Primärschlüsselwerte, die sortiert werden müssen, in sort_buffer abgelegt, und dann wird der Clustered-Index abgefragt, um die zu erhalten Spalten, die nach dem Sortieren abgefragt werden müssen (entspricht einer weiteren Rückkehr zur Tabelle) max_length_for_sort_data 

Bild.png

Wenn beim Sortieren in sort_buffer genügend Speicher vorhanden ist, wird die Sortierung im Speicher durchgeführt. Wenn der Speicher nicht ausreicht, wird die temporäre Datei auf der Festplatte zur Unterstützung der Sortierung verwendet.

Aktivieren Sie diese Option, um zu sehen, ob temporäre Dateien zur Sortierunterstützung verwendet werden. optimizer_trace 

#Optimierer-Tracking aktivieren
 SEToptimierer_trace='enabled=on';
 #sqlstatement
 Wählen Sie * aus der Studentenreihenfolge nach Studentenname aus, limitieren Sie 10000;
 #Zeigen Sie die vom Optimierer verfolgten Informationen an
 SELECT * FROM `information_schema`.`OPTIMIZER_TRACE`\G;

Der zum Sortieren verwendete Algorithmus ist der Zusammenführungsalgorithmus. Er wird zunächst in mehrere kleine Dateien aufgeteilt, sortiert und dann zusammengeführt.

Dabei number_of_tmp_files ist die Anzahl der verwendeten temporären Dateien und sort_buffer_size die Größe von sort_buffer

Bild.png

Daher ist es am besten, einen geeigneten Index zu erstellen, wenn Sie Sortieren nach, Gruppieren nach und andere zu sortierende Schlüsselwörter verwenden.

Wenn die Datenmenge klein ist, kann sie im Sortierpuffer sortiert werden. Wenn die Datenmenge zu groß ist, muss sie mit der Festplatte interagieren.

Zusammenfassen

Wenn die Abfrageanweisung sortiert werden muss, wird sie in zwei Situationen unterteilt: keine Sortierung und Sortierung erforderlich.

Wenn der verwendete Index in Ordnung ist, ist keine Sortierung erforderlich, und die Reihenfolge wird durch den Index sichergestellt.

Wenn der verwendete Index nicht in der richtigen Reihenfolge ist, wird sort_buffer zum Sortieren verwendet. Wenn die Länge des Abfragefelds den Grenzwert nicht überschreitet, speichert jeder Datensatz in sort_buffer die Spalte, die abgefragt werden muss.

Wenn der Grenzwert überschritten wird, speichert sort_buffer nur die zu sortierenden Spalten und Primärschlüsselwerte. Nach dem Sortieren werden die Primärschlüsselwerte verwendet, um die Tabelle zurückzugeben und die abzufragenden Spalten zu erhalten.

Wenn die Datenmenge zu groß ist, um im Speicher sortiert zu werden, werden Festplattenseiten verwendet, um die Sortierung zu unterstützen, und ein Zusammenführungsalgorithmus wird verwendet, um die sortierten Daten auf mehrere Seiten zu verteilen und sie dann zusammenzuführen.

Sie können den Inhalt über den Trace-Optimierer „optimierer_trace“ analysieren, um die Anzahl der Hilfsseiten und andere Informationen anzuzeigen.

Erstellen Sie geeignete Indizes für Spalten, die sortiert werden müssen, um die seitengestützte Sortierung auf der Festplatte zu vermeiden

Sortierpuffer oder max_length_for_sort_data können angepasst werden, wenn die Indizierung nicht verwendet werden kann (mit Vorsicht).

Klicken Sie hier, um zu folgen und so schnell wie möglich mehr über die neuen Technologien von Huawei Cloud zu erfahren~

Das chinesische KI-Team hat zusammengepackt und ist mit Hunderten von Menschen in die USA gereist. Wie viel Umsatz kann Huawei offiziell bekannt geben, dass die Open-Source-Spiegelstation der Yu Chengdong- Universität angepasst wurde? Der offiziell eröffnete externe Netzwerkzugang nutzte TeamViewer, um 3,98 Millionen zu überweisen! Was sollten Remote-Desktop-Anbieter tun? Die erste Front-End-Visualisierungsbibliothek und Gründer von Baidus bekanntem Open-Source-Projekt ECharts – ein ehemaliger Mitarbeiter eines bekannten Open-Source-Unternehmens, der „zum Meer ging“, verbreitete die Nachricht: Nachdem er von seinen Untergebenen herausgefordert worden war, wurde der Techniker Der Anführer wurde wütend und unhöflich und entließ die schwangere Mitarbeiterin. OpenAI erwog, der Rust Foundation zu erlauben, 1 Million US-Dollar zu spenden. Bitte sagen Sie mir, welche Rolle time.sleep(6) spielt ?
{{o.name}}
{{m.name}}

Ich denke du magst

Origin my.oschina.net/u/4526289/blog/11138574
Empfohlen
Rangfolge