MySQL-Abfrageanweisungsprozess und grundlegende Konzepte der EXPLAIN-Anweisung und deren Optimierung

MySQL-Abfrageanweisungsprozess und grundlegende Konzepte der EXPLAIN-Anweisung und deren Optimierung

Die Leistung Ihrer Website oder Ihres Dienstes hängt weitgehend vom Design Ihrer Datenbank ab (vorausgesetzt, Sie wählen das richtige Framework für die Sprachentwicklung) und davon, wie Sie die Daten abfragen.

Wir kennen die Methoden zur Leistungsoptimierung von MySQL, zu denen im Allgemeinen das Erstellen von Indizes, das Vermeiden komplexer gemeinsamer Abfragen, das Festlegen redundanter Felder, das Erstellen von Zwischentabellen, Abfrage-Cache usw. gehören. Wir wissen auch, wie man mit EXPLAIN den Ausführungsplan anzeigt.

Über den Ausführungsprozess und die internen Mechanismen komplexer MySQL-Abfrageanweisungen, die vom MySQL Optimizer selbst vorgenommenen Optimierungen sowie die Auswirkungen von Anpassungen der Abfrageanweisungen auf die Leistung und deren Ursachen ist jedoch wenig bekannt.

In diesem Artikel wird versucht, einige Schlüsselkonzepte wie den Ausführungsprozess und die Indexverwendung eingehender zu erörtern, um das Warum und Warum zu verstehen.

Dadurch kann ein blinder Wechsel zu NoSQL-Speicher oder die Investition in Infrastrukturupgrades vermieden werden, wenn durch eine einfache MySQL-Optimierung gute Ergebnisse erzielt werden können.

Wenn Sie Ihre Arbeit gut machen möchten, müssen Sie zuerst Ihre Werkzeuge schärfen. Hier stellen wir zunächst das Tool zur Leistungsanalyse von MySQL-Abfrageanweisungen vor.

Der EXPLAIN-Befehl von MySQL ist ein Tool zur Analyse der Abfrageleistung. Jede Zeile der EXPLAIN-Ausgabe entspricht der Ausführungsplanbeschreibung einer Tabelle in der Abfrageanweisung. Die Bedeutung der Ausgabespalten ist wie folgt:

Die Typspalte in der obigen Tabelle ist der Tabellenassoziationstyp. Gängige Typen sind die folgenden (von hoch nach niedrig sortiert, je nach Effizienz der Assoziationsabfrage):

const (konstante Verbindung), wie z. B. SELECT * FROM user WHERE id=1;
eq_ref (Referenz mit gleichem Wert), z. B. SELECT * FROM user,card WHERE user.id=card.userid;
ref (Referenz), wird für nicht eindeutige Indizes verwendet, wie z. B. SELECT * FROM user,card WHERE user.last_name='test';
Bereich, z. B. SELECT * FROM tbl_name WHERE key_column > 10;
Index: Daten entsprechend dem Index lesen. Wenn der Index die Abfragedaten bereits enthält, muss nur der Indexbaum gescannt werden. Andernfalls wird ein vollständiger Tabellenscan durchgeführt, der „All“ ähnelt.
ALL (alles), vollständiger Tabellenscan

Die Schlüsselspalte stellt den Index dar und die Zeilen stellen die geschätzte Anzahl der zu scannenden Zeilen dar.

Extra gibt zusätzliche Informationen an. Häufige sind die folgenden (ebenfalls in absteigender Reihenfolge der Abfrageeffizienz angeordnet):

Using index: zeigt die Verwendung eines Indexes an. Wenn gleichzeitig Using where erscheint, bedeutet dies, dass der Index zum Suchen und Lesen von Datensätzen verwendet wird. Wenn Using where nicht gefunden wird, bedeutet dies, dass der Index die Abfragedaten enthält und keine zusätzliche Suche erforderlich ist.
Die Verwendung von where: weist auf eine bedingte Abfrage hin. Wenn die Typspalte ALL oder Index ist und diese Information nicht angezeigt wird, führen Sie möglicherweise eine falsche Abfrage aus: Sie gibt alle Daten zurück.
Filesort verwenden: Das ist nicht das, was „Dateiindex verwenden“ bedeutet! Filesort ist eine von MySQL implementierte Sortierstrategie. Diese Meldung erscheint normalerweise, wenn die Sortieranweisung ORDER BY verwendet wird.
Temporär verwenden: Um das Ergebnis zu erhalten, wird eine temporäre Tabelle verwendet. Dies kommt normalerweise vor, wenn mehrere Tabellen verknüpft und die Ergebnisse sortiert werden.

Wenn die folgenden beiden Meldungen (Using filesort, Using temporary) in EXPLAIN erscheinen und die Zeilen relativ groß sind, bedeutet dies normalerweise, dass Sie die Abfrageanweisung anpassen oder einen Index hinzufügen müssen. Kurz gesagt, Sie müssen versuchen, diese beiden Meldungen zu vermeiden.

Nachfolgend sehen Sie ein Beispiel für EXPLAIN-Ergebnisse (Suchen nach Spitznamen und Geschlechtern aus der Benutzerprofiltabelle, Sortieren nach der Anzahl der Benutzer-Follower in der Benutzertabelle):

Die obige Abfrageanweisung ist ein typischer Problemfall. Die spezifische Bedeutung von „Using filesort“ und „Using temporary“ sowie die Optimierung der obigen Anweisung werden im nächsten Artikel im Zusammenhang mit dem Abfrageprozess und den Prinzipien erläutert.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird Ihnen hilfreich sein. Wenn Sie weitere Fragen haben, können Sie uns gerne eine Nachricht hinterlassen. Bitte schauen Sie weiterhin bei 123WORDPRESS.COM vorbei!

Das könnte Sie auch interessieren:
  • Eine kurze Diskussion über das Problem der Parameterübergabe bei der Verwendung in pymysql-Abfrageanweisungen
  • Sammlung von MySQL-Fuzzy-Abfrageanweisungen
  • Beispiel für eine einfache Operation einer MySQL-Abfrageanweisung
  • Ein Beispiel für die Verwendung von PHP zur gleichzeitigen Ausführung mehrerer SQL-Abfrageanweisungen mit mysqli
  • Tutorial zur MySQL-Infrastruktur: Detaillierte Erläuterung des Ausführungsprozesses von Abfrageanweisungen
  • MySql-Abfrageanweisung mit mehreren Bedingungen und dem Schlüsselwort „OR“
  • Mysql-Abfrageanweisung mit mehreren Bedingungen und dem Schlüsselwort „And“
  • Detaillierte Erläuterung der MySQL-Limitnutzung und Leistungsanalyse von Paging-Abfrageanweisungen
  • Beispielanalyse für den Rückgabewerttyp der PHP-MySQL-Abfrageanweisung
  • Eine vollständige Sammlung von MySQL-Abfrageanweisungen
  • Die umfassendste Sammlung von MySQL-Abfrageanweisungen
  • Einführung in die Unterschiede zwischen Paging-Abfrageanweisungen in Oracle, MySQL und SqlServe
  • Detaillierte Erläuterung des Ausführungsprozesses von MySQL-Abfrageanweisungen

<<:  Detailliertes Tutorial zum Erstellen einer privaten Nextcloud-Cloud-Speichernetzwerkfestplatte

>>:  Die vue-cli-Konfiguration verwendet den vollständigen Prozessdatensatz von Vuex

Artikel empfehlen

Anfänger verstehen das MySQL-Deadlock-Problem anhand des Quellcodes

Nach vielen schwierigen Einzelschritt-Debuggings ...

js, um die Rotation von Webseitenbildern zu realisieren

In diesem Artikel wird der spezifische Code von j...

Vor- und Nachteile von MySQL-Indizes und Richtlinien zum Erstellen von Indizes

1. Warum einen Index erstellen? (Vorteile) Dies l...

Beispiele für die Erstellung und Verwendung von MySQL-Triggern

Inhaltsverzeichnis Was ist ein Auslöser Erstellen...

Beispielcode zur Implementierung eines Waben-/Sechseckatlas mit CSS

Ich weiß nicht warum, aber UI gestaltet gerne Wab...

React Native realisiert den Auf- und Ab-Pull-Effekt der Überwachungsgeste

React Native implementiert die Überwachungsgeste ...

Detaillierte Analyse des MySQL 8.0-Redo-Logs

Inhaltsverzeichnis Vorwort Generierung eines Redo...

Führen Sie die Shell oder das Programm im Docker-Container auf dem Host aus.

Um zu vermeiden, dass für den Betrieb immer wiede...

Grafisches Installationstutorial für MySQL 8.0.17

In diesem Artikel finden Sie das grafische Tutori...

Zusammenfassung häufiger Probleme und Lösungen in Vue (empfohlen)

Es gibt einige Probleme, die nicht auf Vue beschr...

Detailliertes Tutorial zur Integration von Apache Tomcat mit dem IDEA-Editor

1. Laden Sie das komprimierte Tomcat-Paket von de...

Detaillierte Erläuterung des Selinux-Grundkonfigurationstutorials unter Linux

selinux ( Security-Enhanced Linux) ist ein Linux-...

So überwachen Sie MySQL mit Zabbix

Dokumentation zur Zabbix-Bereitstellung Nach der ...