Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Optimierung der Abfrageleistung in MySQL

Experten wissen, wie man leistungseffiziente Abfragen schreibt. Obwohl Erfahrung Weisheit reifen lässt, gibt es bestimmte Dinge, die man zumindest am Anfang verstehen muss. Beispielsweise müssen Sie die wichtigsten Überlegungen zum Abfragedesign verstehen; wie eine Abfrage intern funktioniert, wo sie fehlschlägt, Optimierungsmuster usw. In diesem Artikel stelle ich einige Optimierungspunkte vor, über die Sie beim Entwerfen einer Abfrage in MySQL nachdenken können.

Warum sind einige Abfragen langsam?

Ein häufiges Problem bei SQL-Abfragen besteht darin, dass mehr Daten abgerufen werden, als tatsächlich benötigt werden. Natürlich gibt es Abfragen, die viele Daten durchsuchen, und wir können nicht viel dagegen tun, aber sie sind nicht üblich. In den meisten Fällen ist es ein schlechtes Abfragedesign, das zu einer schlechten Abfrageleistung führt. Nach jedem Abfragedesign müssen Sie einige Aspekte überprüfen, z. B. was passieren könnte, nachdem die Abfrage ausgelöst wurde:

  1. Wird die SQL-Abfrage auf zu viele Spalten oder Zeilen zugreifen?
  2. Wird der MySQL-Server zu viele Zeilen analysieren, um das gewünschte Ergebnis abzurufen?

Es gibt Abfragen, die den MySQL-Server dazu bringen, zu viele Daten zu analysieren, sie aber beim Sichten zu verwerfen. Dies ist eine zusätzliche Arbeit für den Server in Bezug auf viele Aspekte wie Netzwerk-Overhead, zu viel Speicherverbrauch oder zu viel CPU-Ressourcenverbrauch auf dem Server. Die Folge ist eine langsame Leistung.

Es gibt Situationen, in denen Sie während des Entwurfs möglicherweise nicht viel helfen können, aber es gibt eine Situation, in der eine schlechte Abfrage zumindest gut gemacht werden kann, wenn nicht sogar besser, wenn Sie vorsichtig sind und die Konsequenzen abschätzen und sich selbst untersuchen.

Typische Fehler und ihre Lösungen

Beim Schreiben einer Abfrage werden einige häufige Fehler gemacht. Hier sind einige davon. Sie können ein paar weitere Gedanken in derselben Zeile finden. Hier sind die Gründe für die langsame Abfrageleistung mit möglichen Lösungen.

Zu viele Zeilen

Oft wird der Fehler gemacht, eine Abfrage zu schreiben, die Daten abruft, und davon auszugehen, dass MySQL Ergebnisse auf Anfrage bereitstellt, während der Verarbeitungsaufwand übersehen wird, der erforderlich ist, um die vollständige Ergebnismenge zurückzugeben. Angenommen, eine SELECT-Anweisung wird ausgelöst, um 100 Produktdetails für eine E-Commerce-Site abzurufen, wenn nur 10 davon tatsächlich zuerst angezeigt werden müssen. Sie könnten denken, dass MySQL nur 10 Zeilen abruft und die Ausführung der Abfrage beenden. Aber nein. Was MySQL tut, ist die vollständige Ergebnismenge zu generieren und den Client zu füttern. Die Client-Bibliothek erhält den vollständigen Satz und verwirft das meiste davon und behält nur 10 von denen, die sie sucht. Dies verschwendet eindeutig eine Menge Ressourcen.

In einer solchen Situation können Sie jedoch eine Lösung bereitstellen, indem Sie die LIMIT-Klausel mit der Abfrage verwenden.

SELECT
      col1, col2,...
FROM
      table_name
LIMIT
      [offset,] count; 

Die LIMIT-Klausel akzeptiert einen oder zwei Parameter. Der erste gibt den Offset an und der zweite die Anzahl. Wenn nur ein Parameter angegeben wird, bezeichnet er die Anzahl der Zeilen vom Anfang der Ergebnismenge.

Um beispielsweise 10 Zeilen aus der Tabelle auszuwählen, können Sie Folgendes schreiben:

SELECT
      e.emp_name, e.phone, e.email
FROM 
      employee e
LIMIT 10;

Und um die nächsten 10 Zeilen auszuwählen, beginnend mit 11 Datensätzen, können Sie schreiben:

SELECT
      e.emp_name, e.phone, e.email
FROM
      employee e
LIMIT 10, 10;

Zu viele Spalten

Betrachten Sie die Abfrage:SELECT * immer mit Argwohn. Diese Abfrage gibt alle Spalten zurück und Sie benötigen wahrscheinlich nur einige davon. Der größte Nachteil des Abrufens aller Spalten besteht darin, dass es die Optimierung verhindert, indem es die Verwendung von Indizes behindert, zu viel E/A-, Arbeitsspeicher- und CPU-Ressourcen vom Server verlangt.

Verstehen Sie, dass eine solche universelle Abfrage, die alle Spalten abruft, verschwenderisch sein kann. Einige sagen, dass sie nützlich sind, weil sie es Entwicklern ermöglichen, denselben Code an mehr als einer Stelle zu verwenden. Das ist in Ordnung, wenn sich die damit verbundenen Kosten in Grenzen halten. Manchmal hilft in diesem Zusammenhang das Zwischenspeichern abgerufener Daten. Seien Sie jedoch vorsichtig, die Nutzung von Leistung ist eine elegante Aufgabe, und bei einem solchen Luxus ist Leistung möglicherweise nicht angebracht.

Als Faustregel gilt, solche universellen Abfragen zu vermeiden oder die Anzahl der abgerufenen Spalten so gering wie möglich zu halten.

Zu viel Datenanalyse

Abfragen geben das gewünschte Ergebnis zurück, das ist in Ordnung, aber manchmal sind diese Abfragen so geschrieben, dass während der Verarbeitung zu viele Daten untersucht werden müssen, bevor Ergebnisse generiert werden. Daher müssen Sie in MySQL nach den folgenden Kostenmetriken messen:

  • Ausführungszeit
  • Untersuchte Zeilen
  • Untersuchte Spalten

Anhand dieser Metriken können Sie eine grobe Schätzung der Abfragekosten erhalten. Diese spiegeln die Menge des Datenzugriffs durch MySQL intern wider, um die Abfrage zu verarbeiten, und wie schnell die Abfrage ausgeführt wird. Da diese Metriken im Protokoll für langsame Abfragen protokolliert werden, empfiehlt es sich, Abfragen zu untersuchen und zu finden, die zu viele Daten analysieren, um das Ergebnis zurückzugeben. Die MySQL-Datenbank registriert alle Abfragen, die eine bestimmte Ausführungszeit überschreiten, im langsamen Abfrageprotokoll. Dies ist ein idealer Ort, um nach langsamen Abfragen zu suchen und herauszufinden, wie oft sie langsam sind.

Ein Protokoll für langsame Abfragen befindet sich normalerweise unter /var/log/mysql/mysql-slow.log

Beachten Sie, dass man möglicherweise die Protokollierung langsamer Abfragen in mysqld.cnf einstellen und aktivieren muss Konfigurationsdatei wie folgt.

#slow_query_log = 1
#slow_query_log_file = /var/log/mysql/mysql-slow.log
#long_query_time = 2 

Vor und mit MySQL 5 gab es ernsthafte Einschränkungen, insbesondere fehlende Unterstützung für feinkörniges Logging. Die einzige Atempause war die Verwendung von Patches, die die Protokollierung aktivierten. Die Funktion war jedoch Teil der MySQL 5.1- und neueren Server als Teil ihrer Kernfunktion.

Abfragen, deren Ausführung zu viel Zeit in Anspruch nimmt, bedeuten nicht unbedingt, dass es sich um schlechte Abfragen handelt. Das Protokoll für langsame Abfragen bietet lediglich die Möglichkeit, die Abfrageleistung zu untersuchen und sie so weit wie möglich zu verbessern.

Abfragen umstrukturieren

Da Sie die Möglichkeit haben, problematische Anfragen umzustrukturieren, sollte Ihr primäres Ziel darin bestehen, eine alternative Lösung zu finden, um den gewünschten Effekt zu erzielen. Sie können die Abfrage in ihre äquivalente Form umwandeln, wobei Sie die internen Auswirkungen im MySQL-Server während der Verarbeitung berücksichtigen.

Eine Entscheidung im Abfragedesign besteht darin, ob wir eine komplexe Abfrage mehreren einfachen vorziehen oder umgekehrt. Der herkömmliche Ansatz des Datenbankdesigns besteht darin, so viele Arbeiten wie möglich mit weniger Abfragen zu erledigen. Der Grund dafür ist, dass eine große/komplexe Abfrage hinsichtlich des Aufbaus einer Datenbankverbindung kostengünstiger ist. Der Vorteil der Kostenreduzierung zugunsten komplexer Abfragen liegt in der Netzwerknutzung, der Abfrageverarbeitung/Optimierung und der Ressourcennutzung. Aber dieser traditionelle Ansatz passt nicht gut zu MySQL. MySQL wurde entwickelt, um Datenbankverbindungen und -trennungen schnell zu handhaben. Daher scheint es effizienter zu sein, eine Verbindung herzustellen, viele einfachere Abfragen auszulösen und die Verbindung zu schließen. Das Abrufen von Daten durch mehr als eine einfache Abfrage anstelle einer großen komplexen Abfrage ist effektiver. Beachten Sie, dass die gleiche Idee möglicherweise nicht mit anderen Datenbanken angewendet wird.

Schlussfolgerung

Dies sind ein paar schnelle Tipps zur Abfrageoptimierung. Verstehen Sie, dass es nicht ausreicht, die SQL-Syntax zu kennen, um eine Abfrage zu erstellen, die das gewünschte Ergebnis abruft, wenn man die Abfrageleistung anstrebt. Das Verständnis der Vorgänge hinter den scheinbar einfach aussehenden Abfragen ist entscheidend, um eine zu schreiben, die nicht nur das Gewünschte abruft, sondern die Kunst der Optimierung von Anfang an durchdringt. Das Geschehen hinter den Kulissen der Abfrageverarbeitung gibt einen wichtigen Hinweis, um die Abfrageleistung zu verstehen, und dieses Wissen ist ein Muss, bevor Sie sich in den Bereich der Abfrageoptimierung begeben.