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:
- Die aktuellen Datensätze sind von Natur aus geordnet und müssen nicht sortiert werden.
- 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.
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).
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
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
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
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).
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 ?