Datensatz zu langsamen MySQL-Abfragen und Abfragerekonstruktionsmethoden

Datensatz zu langsamen MySQL-Abfragen und Abfragerekonstruktionsmethoden

Vorwort

Was 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 Datenzugriffs

Werden 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 neu

Eine 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:

  1. Der Cache wird effizienter.
  2. Zerlegte Abfragen können Sperrkonflikte reduzieren
  3. Die Anwendungsschicht kann Abfragedaten zwischenspeichern, um den Druck auf die Datenbank zu verringern.
  4. Dies kann die Abfrageeffizienz verbessern, da Abfragen mit Primärschlüsseln usw. möglicherweise effizienter sind als Abfragen, die auf bedingten Bereichen basieren, insbesondere bei großen Tabellen.
  5. Kann die Abfrage redundanter Datensätze reduzieren
  6. Darüber hinaus entspricht dies der Implementierung eines Hash-Joins in der Anwendung, anstatt den Nested Loop Join von MySQL zu verwenden. In einigen Szenarien ist die Hash-Assoziation viel effizienter.

Zusammenfassen

Dies 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:
  • Ausführliche Erläuterung der MySQL-Einstellungen für langsame Abfragen
  • Detaillierte Erläuterung der MySql-Analyse langsamer Abfragen und Öffnen des Protokolls langsamer Abfragen
  • mysql langsame Abfrage aktivieren So aktivieren Sie die Protokollierung langsamer MySQL-Abfragen
  • MySQL-Suche und Optimierungstest für langsame Abfragen
  • So aktivieren Sie das langsame Abfrageprotokoll in MySQL
  • Grundlegendes Tutorial zur Analyse des MySQL-Protokolls für langsame Abfragen
  • Tutorial zur Konfiguration und Verwendung des MySQL-Protokolls für langsame Abfragen
  • Eine langsame MySQL-Abfrage verursachte einen Fehler

<<:  Zusammenfassung der CSS- und XTHML-Schreibstandards und häufigen Probleme (Seitenoptimierung)

>>:  4 Lösungen für CSS-Browserkompatibilitätsprobleme

Artikel empfehlen

Eine kurze Einführung in die Abfrageeffizienz von MySQL-Speicherfeldtypen

Die Suchleistung von der schnellsten bis zur lang...

Grafisches Tutorial zur Deinstallation und Installation von MySQL unter Linux

Dies ist mein erster Blog. Ich bin seit zwei Jahr...

Implementierungsschritte zum Erstellen mehrseitiger Programme mit Webpack

Es ist sehr üblich, webpack zum Erstellen einseit...

Mehrere spezifische Methoden zur MySQL-Speicherplatzbereinigung

Inhaltsverzeichnis Vorwort 1. Überprüfen Sie die ...

Lösung zum Verlassen von Lücken zwischen BootStrap-Rastern

Inhaltsverzeichnis [Siehe ein Beispiel]: [Der urs...

Zusammenfassung von Beispielen gängiger Methoden von JavaScript-Arrays

Inhaltsverzeichnis Gängige Array-Methoden concat(...

Installieren Sie Apache2.4+PHP7.0+MySQL5.7.16 auf macOS Sierra

Obwohl Mac-Systeme mit PHP und Apache ausgeliefer...