VorwortWas ist eine langsame Abfrage und wie kann eine langsame Abfrage optimiert werden? Im Folgenden werden die relevanten Kenntnisse dieser beiden Wissenspunkte vorgestellt. Grundlagen langsamer Abfragen: Optimieren des DatenzugriffsWerden unnötige Daten aus der Datenbank abgefragt? Unnötige Datensätze abfragen: Lösung: Limit nach der Abfrage hinzufügen Alle Spalten zurückgeben, wenn mehrere Tabellen verknüpft sind: Lösung: Nur die benötigten Spalten nehmen Immer alle Spalten abrufen: select * Lösung: Es ist besser, Teilspalten abzurufen, es sei denn, die Anwendung speichert die Spaltendaten im Cache. Wiederholte Abfrage der gleichen Daten: Lösung: Bei Bedarf aus dem Cache holen Scannt MySQL zusätzliche Datensätze? Die Abfragekosten können anhand der Antwortzeit, der Anzahl der gescannten Zeilen und der Anzahl der zurückgegebenen Zeilen gemessen werden. Um die Anzahl der gescannten Zeilen zu reduzieren, können Sie Indizes verwenden, um die erforderlichen Datensätze abzudecken. Das Hinzufügen von Indizes bedeutet jedoch nicht, dass die Anzahl der gescannten Zeilen der Anzahl der zurückgegebenen Zeilen entsprechen kann, z. B. bei Aggregatfunktionen wie Summe und Anzahl. So strukturieren Sie eine Abfrage neuEine komplexe Abfrage oder mehrere einfache Abfragen In der Vergangenheit wurde stets Wert darauf gelegt, dass die Datenbankebene möglichst viel Arbeit übernimmt, da die Abfrageanalyse und -optimierung über die Netzwerkkommunikation ein kostspieliges Unterfangen war. Dieses Konzept lässt sich jedoch nicht auf MySQL anwenden, das auf einfaches Herstellen und Trennen von Verbindungen und effiziente Rückgabe kleiner Abfrageergebnisse ausgelegt ist. Moderne Netzwerke sind sowohl hinsichtlich der Bandbreite als auch der Latenz viel schneller als früher. Bei einigen MySQL-Versionen ist es sogar auf einem Allzweckserver möglich, über 100.000 Abfragen pro Sekunde auszuführen, und selbst eine Gigabit-Netzwerkkarte kann problemlos über 2.000 Abfragen pro Sekunde verarbeiten. Daher ist das Ausführen mehrerer kleiner Abfragen jetzt kein großes Problem mehr. Natürlich ist das Antworten auf die Daten an den Client im Vergleich zum internen Scannen zeitaufwändiger. Unter denselben Bedingungen ist es daher besser, so wenige Abfragen wie möglich zu verwenden. Abfrage teilen Wenn Sie SQL zum Abfragen verwenden, müssen Sie darauf achten, große Abfragen in kleine Abfragen aufzuteilen, um die Auswirkungen auf die Datenbank zu verringern. Wenn eine große Anweisung auf einmal abgeschlossen wird, kann dies viele Daten auf einmal sperren, das gesamte Transaktionsprotokoll füllen, Systemressourcen erschöpfen und andere Abfragen blockieren. Wenn wir beispielsweise Datenstatistiken erstellen, müssen wir die Informationen einer großen Anzahl von Bestellnummern abfragen. Sollten wir die IN-Abfrage auf einmal verwenden oder die Parameterliste kürzen und die Abfrage mehrmals durchführen? Die Antwort besteht darin, die Parameterliste zu kürzen und die Abfrage mehrmals durchzuführen. Denn wenn die IN-Parameter zu viele sind, denkt MySQL, dass der Index nicht mehr verwendet werden kann, und führt möglicherweise eine vollständige Tabellenabfrage durch. Wenn die Datenmenge in der Datentabelle zu diesem Zeitpunkt zu groß ist, kann dies zu einem Timeout der Abfrage führen. // zerlegt eine Liste in nicht sichtbare Unterlisten der Länge L statisch <T> Liste<Liste<T>> gehackt(Liste<T> Liste, endgültige int L) { Liste<Liste<T>> Teile = neue ArrayList<Liste<T>>(); endgültige int N = Liste.Größe(); für (int i = 0; i < N; i += L) { Teile.Hinzufügen(neue ArrayList<T>( Liste.Unterliste(i, Math.min(N, i + L))) ); } Rücksendeteile; } Liste<Integer> Zahlen = Sammlungen.unmodifiableList( Arrays.alsList(5,3,1,2,9,5,0,7) ); Liste<Liste<Ganzzahl>> Teile = gehackt(Zahlen, 3); System.out.println(Teile); // druckt "[[5, 3, 1], [2, 9, 5], [0, 7]]" teile.get(0).add(-1); System.out.println(Teile); // druckt "[[5, 3, 1, -1], [2, 9, 5], [0, 7]]" System.out.println(Zahlen); // druckt "[5, 3, 1, 2, 9, 5, 0, 7]" (unverändert!) Kürzen Sie die Liste programmgesteuert, sodass die Abfrage den Index statt eines vollständigen Tabellenscans verwenden kann. Das Alibaba-Entwicklungshandbuch empfiehlt, die Anzahl der Sammlungselemente nach „in“ sorgfältig zu bewerten und innerhalb von 1.000 zu halten. Zerlegen einer relationalen Abfrage Zerlegen Sie den Inner Join mehrerer Tabellen in kleine Abfragen. Wenn der Join mehr als drei Tabellen umfasst, muss er verboten werden. Zu den Vorteilen zählen:
ZusammenfassenDies ist das Ende dieses Artikels über langsame MySQL-Abfragen und Abfragerekonstruktion. Weitere relevante Inhalte zu langsamen MySQL-Abfragen und Abfragerekonstruktion finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Zusammenfassung der CSS- und XTHML-Schreibstandards und häufigen Probleme (Seitenoptimierung)
>>: 4 Lösungen für CSS-Browserkompatibilitätsprobleme
Die Suchleistung von der schnellsten bis zur lang...
Wie unten dargestellt: Aktualisiere Tabelle1 als ...
In diesem Artikel wird der Beispielcode für erwei...
1. Abnormale Leistung beim Docker-Start: 1. Der S...
Inhaltsverzeichnis 1. Bootstrap-Rasterlayout 2. V...
Dies ist mein erster Blog. Ich bin seit zwei Jahr...
Es ist sehr üblich, webpack zum Erstellen einseit...
Inhaltsverzeichnis Vorwort 1. Überprüfen Sie die ...
Vorschau auf die überarbeitete Fassung Dieser Art...
Inhaltsverzeichnis Was ist eine relationale Daten...
Inhaltsverzeichnis [Siehe ein Beispiel]: [Der urs...
Inhaltsverzeichnis Gängige Array-Methoden concat(...
Überblick: Oracle Scott-Benutzer haben vier Tabel...
Inhaltsverzeichnis 1. MySQL-Kompilierung und -Ins...
Obwohl Mac-Systeme mit PHP und Apache ausgeliefer...