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

Bestes Tool zur Leistungsoptimierung von MySQL?

Die schlechte Nachricht:Es gibt GUI-Tools, die dabei helfen, aber es ist eine qualifizierte und weitreichende Aufgabe. Sie decken also nicht alles ab, es ist wahrscheinlich, dass Sie Befehlszeilen-Zeug/SQL-Anweisungen usw. verwenden müssen, um zu helfen. Ich habe nur die Kommandozeilen-Tools wirklich verwendet. Ich gebe einen kleinen Überblick über Dinge, die ich weiß/verwendet habe:

Zunächst benötigen Sie ein gutes Datenbankdesign. Wenn das Design schlecht ist, kommt man nur so weit. Dazu gehören die Normalisierung sowie die Verwendung geeigneter Typen für Felder. Ich lasse diesen Punkt hier, da ich denke, dass er ein bisschen nebensächlich ist und nicht das, wonach Sie suchen.

Stellen Sie sicher, dass der MySQL-Abfrage-Cache eingerichtet ist und funktioniert, und geben Sie ihm etwas mehr RAM, wenn Sie können, und stellen Sie sicher, dass Ihre wichtigen Abfragen nichts tun, was verhindert, dass mysql sie zwischenspeichert. Wenn Sie beispielsweise die Funktion NOW() in Abfragen verwenden, ändert sich dies aus offensichtlichen Gründen jede Sekunde! Sie können stattdessen einen Zeitstempel in die SQL einfügen und die Zeit auf die nächste Minute/Stunde/Tag (die längste Zeitspanne, mit der Sie davonkommen können) verwenden, damit mysql einige Caching-Vorteile erhält.

Um mit der Optimierung zu beginnen:Das Anbringen von „EXPLAIN“ vor „select“ ist DER Weg, um zu sehen, wie eine Abfrage ausgeführt wird, und um herauszufinden, wie sie verbessert werden kann. Lernen Sie, die Ausgabe zu interpretieren:http://dev.mysql .com/doc/refman/5.0/en/using-explain.html Sie werden oft in der Lage sein, neue Indizes hinzuzufügen/Spalten zu bestehenden hinzuzufügen, um die Dinge zu verbessern. Es kommt aber auch vor, dass Abfragen umstrukturiert werden müssen.

Beginnen Sie mit der Verbesserung der Leistung mit MySQL (vorausgesetzt, Sie kennen die problematische Abfrage noch nicht), indem Sie das Protokoll für langsame Abfragen überprüfen - es protokolliert alle Abfragen, die länger als x Sekunden dauern, in einer Datei.

Eine Übersicht, einschließlich der Konfiguration für den Fall, dass dies nicht bereits protokolliert wird, finden Sie hier:http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.html - Ich habe auch festgestellt, dass das Festlegen von long_query_time auf 0 für etwa einen Tag, sodass alle Abfragen hier mit der benötigten Zeit protokolliert werden, eine nützliche Methode ist, um eine Vorstellung davon zu bekommen, wohin die Leistung genau geht. Aber ich würde nicht sofort dorthin gehen! Und lassen Sie es nicht eingeschaltet, die Protokolle können sehr umfangreich werden.

Nachdem Sie ein paar Tage mit dem Protokollieren verbracht haben, habe ich hier mysqlsla (mysql slow log analyzer) gefunden:http://hackmysql.com/mysqlsla ist ein gutes Werkzeug.

Es kann mehr als nur eine langsame Abfrageprotokollanalyse - lesen Sie das Handbuch. Aber um zu erklären, was es für langsame Protokolle tut:Das Protokoll für langsame Abfragen kann viele Daten enthalten, daher kann es schwierig sein, herauszufinden, welche Abfragen insgesamt die teuersten sind - z. B.:Berücksichtigen Sie, wie oft sie ausgeführt werden und wann zwei Abfragen eigentlich gleich sind, mit einer anderen ID in einer where-Klausel.

MySQL sla erledigt das alles für Sie. Es durchläuft das Protokoll und kann Abfragen gruppieren, die gleich sind/unterschiedliche Werte in den where-Klauseln haben. Es präsentiert Ihnen dann (standardmäßig) die Top 10 Abfragen in Bezug auf die Gesamtausführungszeit – was oft einige Überraschungen bereithält, aber normalerweise der produktivste Ausgangspunkt ist – nehmen Sie die teuerste Abfrage und verwenden Sie EXPLAIN darauf und sehen Sie, ob Sie sich verbessern können es.

Einige Abfragen dauern lange und können nicht einfach verbessert werden. Können Sie in diesem Fall die Daten auf andere Weise abrufen oder zumindest zwischenspeichern? Möglicherweise müssen Sie sogar das DB-Schema ändern. In ähnlicher Weise können einige Abfragen oben in der mysqlsla-Ausgabe stehen, weil Sie sie häufig ausführen (besonders wahr, wenn long_query_time auf 0 gesetzt ist), selbst wenn sie ziemlich schnell ausgeführt werden. Vielleicht ist es an der Zeit, Ihrer App etwas Caching hinzuzufügen?

http://www.maatkit.org/ sieht auch vielversprechend aus - nie verwendet, aber das mk-query-profiler-Tool sollte nützlich sein, um weiter zu untersuchen, warum Abfragen langsam sind.

Eine völlig separate Sache, die Sie sich ebenfalls ansehen sollten:die "Status"-Seite in PHPMYADMIN (oder Sie können alle Abfragen ausführen, um diese Informationen zu generieren ....) - sie hebt Dinge, die sie für schlecht hält, rot hervor und kann Ihnen helfen Sehen Sie, wo Sie von der Zuweisung von Systemressourcen profitieren könnten. Ich weiß nicht viel darüber - mein Ansatz war immer, wenn etwas rot ist und schlecht aussieht, sich darüber zu informieren und zu entscheiden, ob es wichtig ist und ob ich etwas tun sollte (bedeutet normalerweise, MySQL mehr Ressourcen zuzuweisen durch Ändern der Konfiguration).

Kürzlich habe ich festgestellt, dass das Ausführen von SHOW PROCESSLIST auch auf einem Server, der leidet, nützlich sein kann. Während es Ihnen nur Live-Informationen (naja, einen Live-Schnappschuss) gibt, kann es Ihnen helfen, ein Gefühl dafür zu bekommen, was zu einem bestimmten Zeitpunkt vor sich geht, insbesondere wenn Sie ein paar Mal aktualisieren und die Änderungen beobachten. Ich habe kürzlich einen Server entdeckt, der jede verfügbare MySQL-Verbindung verwendet, um eine identische Abfrage mit dieser Methode auszuführen. Sicher, es wäre im langsamen Abfrageprotokoll gewesen, aber dies ist eine wirklich schnelle und offensichtliche Möglichkeit, um zu sehen, was los ist.